From dac6e8a77ef6dd6ce14d85482943b967b9fd390f Mon Sep 17 00:00:00 2001 From: Protino Date: Sun, 27 Nov 2016 17:07:22 +0530 Subject: [PATCH] Several changes 1. Add widgets 2. Add wallpaper functionality using muzei 3. Integrate places API --- .gitignore | 2 + app/build.gradle | 11 +- app/libs/muzei-api-2.0.jar | Bin 0 -> 22415 bytes app/src/main/AndroidManifest.xml | 50 +++ app/src/main/ic_launcher-web.png | Bin 39513 -> 0 bytes .../sunshine_v2/Activity/MainActivity.java | 44 +-- .../Fragment/ForecastFragment.java | 341 ++++++++++++------ .../calgen/prodek/sunshine_v2/Utility.java | 40 +- .../sunshine_v2/adapter/ForecastAdapter.java | 8 +- .../customView/LocationEditText.java | 31 ++ .../sunshine_v2/muzei/WeatherMuzeiSource.java | 64 ++++ .../sunshine_v2/sync/SunshineSyncAdapter.java | 22 ++ .../widget/DetailWidgetProvider.java | 89 +++++ .../DetailWidgetRemoteViewsService.java | 176 +++++++++ .../widget/TodayWidgetIntentService.java | 138 +++++++ .../widget/TodayWidgetProvider.java | 38 ++ .../ic_my_location_black_24dp.png | Bin 0 -> 648 bytes .../res/drawable-hdpi/ic_share_white_24dp.png | Bin 0 -> 487 bytes .../ic_my_location_black_24dp.png | Bin 0 -> 405 bytes .../res/drawable-mdpi/ic_share_white_24dp.png | Bin 0 -> 323 bytes .../ic_my_location_black_24dp.png | Bin 0 -> 804 bytes .../drawable-xhdpi/ic_share_white_24dp.png | Bin 0 -> 606 bytes .../ic_my_location_black_24dp.png | Bin 0 -> 1219 bytes .../drawable-xxhdpi/ic_share_white_24dp.png | Bin 0 -> 899 bytes .../ic_my_location_black_24dp.png | Bin 0 -> 1722 bytes .../drawable-xxxhdpi/ic_share_white_24dp.png | Bin 0 -> 1203 bytes .../main/res/layout/detail_extras_grid.xml | 15 +- app/src/main/res/layout/fragment_main.xml | 79 ++-- .../main/res/layout/list_item_forecast.xml | 21 +- .../main/res/layout/pref_current_location.xml | 13 + app/src/main/res/layout/widget_detail.xml | 48 +++ app/src/main/res/layout/widget_list_item.xml | 75 ++++ app/src/main/res/layout/widget_today.xml | 51 +++ .../main/res/layout/widget_today_large.xml | 65 ++++ .../main/res/layout/widget_today_small.xml | 36 ++ app/src/main/res/menu/detailfragment.xml | 2 +- app/src/main/res/mipmap-hdpi/ic_muzei.png | Bin 0 -> 5779 bytes app/src/main/res/mipmap-mdpi/ic_muzei.png | Bin 0 -> 3542 bytes app/src/main/res/mipmap-xhdpi/ic_muzei.png | Bin 0 -> 7887 bytes app/src/main/res/mipmap-xxhdpi/ic_muzei.png | Bin 0 -> 12497 bytes app/src/main/res/mipmap-xxxhdpi/ic_muzei.png | Bin 0 -> 17018 bytes app/src/main/res/values-sw600dp/bools.xml | 4 + app/src/main/res/values-v11/bools.xml | 4 + app/src/main/res/values-v14/dimens.xml | 4 + app/src/main/res/values/bools.xml | 5 + app/src/main/res/values/dimens.xml | 16 + app/src/main/res/values/strings.xml | 7 + app/src/main/res/xml/widget_info_detail.xml | 13 + app/src/main/res/xml/widget_info_today.xml | 12 + 49 files changed, 1331 insertions(+), 193 deletions(-) create mode 100644 app/libs/muzei-api-2.0.jar delete mode 100644 app/src/main/ic_launcher-web.png create mode 100644 app/src/main/java/com/calgen/prodek/sunshine_v2/muzei/WeatherMuzeiSource.java create mode 100644 app/src/main/java/com/calgen/prodek/sunshine_v2/widget/DetailWidgetProvider.java create mode 100644 app/src/main/java/com/calgen/prodek/sunshine_v2/widget/DetailWidgetRemoteViewsService.java create mode 100644 app/src/main/java/com/calgen/prodek/sunshine_v2/widget/TodayWidgetIntentService.java create mode 100644 app/src/main/java/com/calgen/prodek/sunshine_v2/widget/TodayWidgetProvider.java create mode 100644 app/src/main/res/drawable-hdpi/ic_my_location_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_share_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_my_location_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_share_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_my_location_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_my_location_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_my_location_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png create mode 100644 app/src/main/res/layout/pref_current_location.xml create mode 100644 app/src/main/res/layout/widget_detail.xml create mode 100644 app/src/main/res/layout/widget_list_item.xml create mode 100644 app/src/main/res/layout/widget_today.xml create mode 100644 app/src/main/res/layout/widget_today_large.xml create mode 100644 app/src/main/res/layout/widget_today_small.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_muzei.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_muzei.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_muzei.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_muzei.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_muzei.png create mode 100644 app/src/main/res/values-sw600dp/bools.xml create mode 100644 app/src/main/res/values-v11/bools.xml create mode 100644 app/src/main/res/values-v14/dimens.xml create mode 100644 app/src/main/res/values/bools.xml create mode 100644 app/src/main/res/xml/widget_info_detail.xml create mode 100644 app/src/main/res/xml/widget_info_today.xml diff --git a/.gitignore b/.gitignore index 23d6940..1d0789b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ .DS_Store /build /captures +/.log +/projectFilesBackup diff --git a/app/build.gradle b/app/build.gradle index e8e4acd..d116487 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,10 +6,12 @@ android { defaultConfig { applicationId "com.calgen.prodek.sunshine_v2" - minSdkVersion 10 + minSdkVersion 11 targetSdkVersion 23 versionCode 1 versionName "1.0" + multiDexEnabled true + } buildTypes { release { @@ -24,21 +26,22 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) + compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.2.0' compile 'com.android.support:design:23.2.0' compile 'com.android.support:support-v4:23.2.0' compile 'com.android.support:support-annotations:23.2.0' compile 'com.github.bumptech.glide:glide:3.5.2' - compile 'com.google.android.gms:play-services:9.8.0' compile 'com.google.firebase:firebase-core:9.8.0' compile 'com.google.firebase:firebase-messaging:9.8.0' compile 'com.android.support:gridlayout-v7:23.2.0' - //cardview and recycler view compile 'com.android.support:cardview-v7:23.2.0' compile 'com.android.support:recyclerview-v7:23.2.0' + compile files('libs/muzei-api-2.0.jar') + compile 'com.google.android.gms:play-services-places:9.8.0' + compile 'com.google.android.gms:play-services-gcm:9.8.0' } diff --git a/app/libs/muzei-api-2.0.jar b/app/libs/muzei-api-2.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..895b0c45f0cd7169f773cbd0f84566531486b50a GIT binary patch literal 22415 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 Hq;LNN{W~@@ literal 0 HcmV?d00001 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0943978..5a2b282 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,6 +24,9 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png deleted file mode 100644 index 5e7e9996abe3cca56280d1b34360f7b397264248..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39513 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

|qxRJZosCe2QFfcvQ(}Ub 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 F_8){h{F(p& diff --git a/app/src/main/java/com/calgen/prodek/sunshine_v2/Activity/MainActivity.java b/app/src/main/java/com/calgen/prodek/sunshine_v2/Activity/MainActivity.java index 5946805..dbaef9b 100644 --- a/app/src/main/java/com/calgen/prodek/sunshine_v2/Activity/MainActivity.java +++ b/app/src/main/java/com/calgen/prodek/sunshine_v2/Activity/MainActivity.java @@ -18,18 +18,16 @@ import com.calgen.prodek.sunshine_v2.R; import com.calgen.prodek.sunshine_v2.Utility; import com.calgen.prodek.sunshine_v2.adapter.ForecastAdapter; +import com.calgen.prodek.sunshine_v2.data.WeatherContract; import com.calgen.prodek.sunshine_v2.fragment.DetailFragment; import com.calgen.prodek.sunshine_v2.fragment.ForecastFragment; import com.calgen.prodek.sunshine_v2.sync.SunshineSyncAdapter; -import com.google.android.gms.common.ConnectionResult; -import com.google.android.gms.common.GoogleApiAvailability; public class MainActivity extends AppCompatActivity implements ForecastFragment.Callback { private static final String TAG = MainActivity.class.getSimpleName(); private static final String DETAIL_FRAGMENT_TAG = "DFTAG"; private static final String PANE_TYPE = "pane_type"; - private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; private static boolean mTwoPane; private String mLocation; @@ -41,12 +39,21 @@ protected void onCreate(Bundle savedInstanceState) { setSupportActionBar(toolbar); getSupportActionBar().setDisplayShowTitleEnabled(false); mLocation = Utility.getPreferredLocation(this); + + Uri contentUri = getIntent() != null ? getIntent().getData() : null; + if (findViewById(R.id.weather_detail_container) != null) { mTwoPane = true; if (savedInstanceState == null) { + DetailFragment detailFragment = new DetailFragment(); + if (contentUri != null) { + Bundle bundle = new Bundle(); + bundle.putParcelable(DetailFragment.DETAIL_URI, contentUri); + detailFragment.setArguments(bundle); + } getSupportFragmentManager().beginTransaction() - .replace(R.id.weather_detail_container, new DetailFragment(), DETAIL_FRAGMENT_TAG) + .replace(R.id.weather_detail_container, detailFragment, DETAIL_FRAGMENT_TAG) .commit(); } } else { @@ -55,7 +62,11 @@ protected void onCreate(Bundle savedInstanceState) { ForecastFragment forecastFragment = (ForecastFragment) (getSupportFragmentManager().findFragmentById(R.id.fragment_forecast)); forecastFragment.setUseTodayLayout(!mTwoPane); - + if (contentUri != null) { + forecastFragment.setInitialSelectedDate( + WeatherContract.WeatherEntry.getDateFromUri(contentUri) + ); + } SunshineSyncAdapter.initializeSyncAdapter(this); } @@ -150,27 +161,4 @@ public void onItemSelected(Uri dateUri, ForecastAdapter.ViewHolder viewHolder) { ActivityCompat.startActivity(this, intent, activityOptionsCompat.toBundle()); } } - - /** - * Check the device to make sure it has the Google Play Services APK. - * If it doesn't, display a dialog that allows users to download the APK from - * the Google Play Store or enable it in the device's system settings. - * - * @return true if PlayServices is available else false - */ - private boolean checkPlayServices() { - GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); - int resultCode = apiAvailability.isGooglePlayServicesAvailable(this); - if (resultCode != ConnectionResult.SUCCESS) { - if (apiAvailability.isUserResolvableError(resultCode)) { - apiAvailability.getErrorDialog(this, resultCode, - PLAY_SERVICES_RESOLUTION_REQUEST).show(); - } else { - Log.i(TAG, "This device is not supported"); - finish(); - } - return false; - } - return true; - } } diff --git a/app/src/main/java/com/calgen/prodek/sunshine_v2/Fragment/ForecastFragment.java b/app/src/main/java/com/calgen/prodek/sunshine_v2/Fragment/ForecastFragment.java index dc4317b..c0dd9bc 100644 --- a/app/src/main/java/com/calgen/prodek/sunshine_v2/Fragment/ForecastFragment.java +++ b/app/src/main/java/com/calgen/prodek/sunshine_v2/Fragment/ForecastFragment.java @@ -1,45 +1,47 @@ package com.calgen.prodek.sunshine_v2.fragment; + import android.annotation.TargetApi; -import android.content.Context; +import android.app.Activity; +import android.content.Intent; import android.content.SharedPreferences; import android.content.res.TypedArray; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.support.annotation.Nullable; +import android.preference.PreferenceManager; +import android.support.design.widget.AppBarLayout; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; +import android.support.v4.view.ViewCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; +import android.util.Log; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.AbsListView; -import android.widget.LinearLayout; -import android.widget.ListView; import android.widget.TextView; import com.calgen.prodek.sunshine_v2.R; import com.calgen.prodek.sunshine_v2.Utility; import com.calgen.prodek.sunshine_v2.adapter.ForecastAdapter; import com.calgen.prodek.sunshine_v2.data.WeatherContract; -import com.calgen.prodek.sunshine_v2.sync.SunshineSyncAdapter.LocationStatus; - -import static com.calgen.prodek.sunshine_v2.sync.SunshineSyncAdapter.LOCATION_STATUS_INVALID; -import static com.calgen.prodek.sunshine_v2.sync.SunshineSyncAdapter.LOCATION_STATUS_SERVER_DOWN; -import static com.calgen.prodek.sunshine_v2.sync.SunshineSyncAdapter.LOCATION_STATUS_SERVER_INVALID; +import com.calgen.prodek.sunshine_v2.sync.SunshineSyncAdapter; /** - * A placeholder fragment containing a simple view. + * Encapsulates fetching the forecast and displaying it as a {@link android.support.v7.widget.RecyclerView} layout. */ -public class ForecastFragment extends Fragment implements LoaderManager.LoaderCallbacks, SharedPreferences.OnSharedPreferenceChangeListener, ForecastAdapter.ForecastAdapterOnClickHandler { - +public class ForecastFragment extends Fragment implements LoaderManager.LoaderCallbacks, SharedPreferences.OnSharedPreferenceChangeListener { + public static final String LOG_TAG = ForecastFragment.class.getSimpleName(); // These indices are tied to FORECAST_COLUMNS. If FORECAST_COLUMNS changes, these // must change. public static final int COL_WEATHER_ID = 0; @@ -49,10 +51,12 @@ public class ForecastFragment extends Fragment implements LoaderManager.LoaderCa public static final int COL_WEATHER_MIN_TEMP = 4; public static final int COL_LOCATION_SETTING = 5; public static final int COL_WEATHER_CONDITION_ID = 6; - static final int COL_COORD_LAT = 7; - static final int COL_COORD_LONG = 8; - private static final String LOG_TAG = ForecastFragment.class.getSimpleName(); - private static final int MY_LOADER_ID = 101; + public static final int COL_COORD_LAT = 7; + public static final int COL_COORD_LONG = 8; + private static final String SELECTED_KEY = "selected_position"; + private static final int FORECAST_LOADER = 0; + // For the forecast view we're showing only a small subset of the stored data. + // Specify the columns we need. private static final String[] FORECAST_COLUMNS = { // In this case the id needs to be fully qualified with a table name, since // the content provider joins the location & weather tables in the background @@ -70,120 +74,211 @@ public class ForecastFragment extends Fragment implements LoaderManager.LoaderCa WeatherContract.LocationEntry.COLUMN_COORD_LAT, WeatherContract.LocationEntry.COLUMN_COORD_LONG }; - private static final String SELECTED_KEY = "selected_item_position"; - private static int mPosition = RecyclerView.NO_POSITION; private ForecastAdapter mForecastAdapter; - private RecyclerView recyclerView; - private TextView mEmptyView; - private boolean mUseTodayLayout; + private RecyclerView mRecyclerView; + private boolean mUseTodayLayout, mAutoSelectView; private int mChoiceMode; - private boolean autoSelectView; - private LinearLayout parallaxBar; - private boolean sharedTransition; + private boolean mHoldForTransition; + private long mInitialSelectedDate = -1; public ForecastFragment() { } @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - if (sharedTransition) getActivity().supportPostponeEnterTransition(); - getLoaderManager().initLoader(MY_LOADER_ID, null, this); - super.onActivityCreated(savedInstanceState); + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // Add this line in order for this fragment to handle menu events. + setHasOptionsMenu(true); } @Override - public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) { - super.onInflate(context, attrs, savedInstanceState); - TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ForecastFragment, 0, 0); - mChoiceMode = array.getInt(R.styleable.ForecastFragment_android_choiceMode, AbsListView.CHOICE_MODE_NONE); - autoSelectView = array.getBoolean(R.styleable.ForecastFragment_autoSelectView, false); - sharedTransition = array.getBoolean(R.styleable.ForecastFragment_sharedElementTransitions, false); - array.recycle(); + public void onResume() { + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); + sp.registerOnSharedPreferenceChangeListener(this); + super.onResume(); } @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - setRetainInstance(true); - super.onCreate(savedInstanceState); + public void onPause() { + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); + sp.unregisterOnSharedPreferenceChangeListener(this); + super.onPause(); } @Override - public void onSaveInstanceState(Bundle outState) { - // When tablets rotate, the currently selected list item needs to be saved. - // When no item is selected, mPosition will be set to RecyclerView.NO_POSITION, - // so check for that before storing. - if (mPosition != RecyclerView.NO_POSITION) { - outState.putInt(SELECTED_KEY, mPosition); - } - mForecastAdapter.onSaveInstanceState(outState); - super.onSaveInstanceState(outState); + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.menu_main, menu); } - public void setUseTodayLayout(boolean useTodayLayout) { - mUseTodayLayout = useTodayLayout; - if (mForecastAdapter != null) { - mForecastAdapter.setUseTodayLayout(mUseTodayLayout); + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + if (id == R.id.action_map) { + openPreferredLocationInMap(); + return true; } + + return super.onOptionsItemSelected(item); } @Override - public View onCreateView(final LayoutInflater inflater, ViewGroup container, + public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { + super.onInflate(activity, attrs, savedInstanceState); + TypedArray a = activity.obtainStyledAttributes(attrs, R.styleable.ForecastFragment, + 0, 0); + mChoiceMode = a.getInt(R.styleable.ForecastFragment_android_choiceMode, AbsListView.CHOICE_MODE_NONE); + mAutoSelectView = a.getBoolean(R.styleable.ForecastFragment_autoSelectView, false); + mHoldForTransition = a.getBoolean(R.styleable.ForecastFragment_sharedElementTransitions, false); + a.recycle(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + + View rootView = inflater.inflate(R.layout.fragment_main, container, false); + + // Get a reference to the RecyclerView, and attach this adapter to it. + mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView_forecast); + + // Set the layout manager + mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); View emptyView = rootView.findViewById(R.id.recyclerView_forecast_empty); - mForecastAdapter = new ForecastAdapter(getActivity(), this, emptyView, mChoiceMode); - mForecastAdapter.setUseTodayLayout(mUseTodayLayout); - recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView_forecast); - recyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); - recyclerView.setAdapter(mForecastAdapter); - recyclerView.setHasFixedSize(true); + // use this setting to improve performance if you know that changes + // in content do not change the layout size of the RecyclerView + mRecyclerView.setHasFixedSize(true); + + // The ForecastAdapter will take data from a source and + // use it to populate the RecyclerView it's attached to. + mForecastAdapter = new ForecastAdapter(getActivity(), new ForecastAdapter.ForecastAdapterOnClickHandler() { + @Override + public void onClick(Long date, ForecastAdapter.ViewHolder vh) { + String locationSetting = Utility.getPreferredLocation(getActivity()); + ((Callback) getActivity()) + .onItemSelected(WeatherContract.WeatherEntry.buildWeatherLocationWithDate( + locationSetting, date), + vh + ); + } + }, emptyView, mChoiceMode); - //check if parallax bar is available - parallaxBar = (LinearLayout) rootView.findViewById(R.id.parallax_bar); + // specify an adapter (see also next example) + mRecyclerView.setAdapter(mForecastAdapter); - if (parallaxBar != null) { + final View parallaxView = rootView.findViewById(R.id.parallax_bar); + if (null != parallaxView) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); - int max = parallaxBar.getHeight(); - float translateY = (parallaxBar.getTranslationY() - dy / 2); + int max = parallaxView.getHeight(); if (dy > 0) { - parallaxBar.setTranslationY(Math.max(-max, translateY)); + parallaxView.setTranslationY(Math.max(-max, parallaxView.getTranslationY() - dy / 2)); } else { - parallaxBar.setTranslationY(Math.min(0, translateY)); + parallaxView.setTranslationY(Math.min(0, parallaxView.getTranslationY() - dy / 2)); } - } }); } } + final AppBarLayout appbarView = (AppBarLayout) rootView.findViewById(R.id.appbar); + if (null != appbarView) { + ViewCompat.setElevation(appbarView, 0); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + if (0 == mRecyclerView.computeVerticalScrollOffset()) { + appbarView.setElevation(0); + } else { + appbarView.setElevation(appbarView.getTargetElevation()); + } + } + }); + } + } - if (savedInstanceState != null && savedInstanceState.containsKey(SELECTED_KEY)) { - mPosition = savedInstanceState.getInt(SELECTED_KEY); + // If there's instance state, mine it for useful information. + // The end-goal here is that the user never knows that turning their device sideways + // does crazy lifecycle related things. It should feel like some stuff stretched out, + // or magically appeared to take advantage of room, but data or place in the app was never + // actually *lost*. + if (savedInstanceState != null) { + mForecastAdapter.onRestoreInstanceState(savedInstanceState); } - mForecastAdapter.setUseTodayLayout(mUseTodayLayout); + mForecastAdapter.setUseTodayLayout(mUseTodayLayout); return rootView; } @Override - public void onDestroy() { - super.onDestroy(); - recyclerView.clearOnScrollListeners(); + public void onActivityCreated(Bundle savedInstanceState) { + // We hold for transition here just in-case the activity + // needs to be re-created. In a standard return transition, + // this doesn't actually make a difference. + if (mHoldForTransition) { + getActivity().supportPostponeEnterTransition(); + } + getLoaderManager().initLoader(FORECAST_LOADER, null, this); + super.onActivityCreated(savedInstanceState); + } + + // since we read the location when we create the loader, all we need to do is restart things + public void onLocationChanged() { + getLoaderManager().restartLoader(FORECAST_LOADER, null, this); + } + + private void openPreferredLocationInMap() { + // Using the URI scheme for showing a location found on a map. This super-handy + // intent can is detailed in the "Common Intents" page of Android's developer site: + // http://developer.android.com/guide/components/intents-common.html#Maps + if (null != mForecastAdapter) { + Cursor c = mForecastAdapter.getCursor(); + if (null != c) { + c.moveToPosition(0); + String posLat = c.getString(COL_COORD_LAT); + String posLong = c.getString(COL_COORD_LONG); + Uri geoLocation = Uri.parse("geo:" + posLat + "," + posLong); + + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(geoLocation); + + if (intent.resolveActivity(getActivity().getPackageManager()) != null) { + startActivity(intent); + } else { + Log.d(LOG_TAG, "Couldn't call " + geoLocation.toString() + ", no receiving apps installed!"); + } + } + + } } @Override - public Loader onCreateLoader(int id, Bundle args) { - String locationSetting = Utility.getPreferredLocation(getActivity()); + public void onSaveInstanceState(Bundle outState) { + // When tablets rotate, the currently selected list item needs to be saved. + mForecastAdapter.onSaveInstanceState(outState); + super.onSaveInstanceState(outState); + } + + @Override + public Loader onCreateLoader(int i, Bundle bundle) { + // This is called when a new Loader needs to be created. This + // fragment only uses one loader, so we don't care about checking the id. + + // To only show current and future dates, filter the query to return weather only for + // dates after or including today. // Sort order: Ascending, by date. String sortOrder = WeatherContract.WeatherEntry.COLUMN_DATE + " ASC"; + + String locationSetting = Utility.getPreferredLocation(getActivity()); Uri weatherForLocationUri = WeatherContract.WeatherEntry.buildWeatherLocationWithStartDate( locationSetting, System.currentTimeMillis()); @@ -198,29 +293,42 @@ public Loader onCreateLoader(int id, Bundle args) { @Override public void onLoadFinished(Loader loader, Cursor data) { mForecastAdapter.swapCursor(data); - if (mPosition != ListView.INVALID_POSITION) { - // If we don't need to restart the loader, and there's a desired position to restore - // to, do so now. - recyclerView.smoothScrollToPosition(mPosition); - } updateEmptyView(); if (data.getCount() == 0) { getActivity().supportStartPostponedEnterTransition(); } else { - recyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + mRecyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { // Since we know we're going to get items, we keep the listener around until // we see Children. - if (recyclerView.getChildCount() > 0) { - recyclerView.getViewTreeObserver().removeOnPreDrawListener(this); - int itemPosition = mForecastAdapter.getSelectedItemPosition(); - if (RecyclerView.NO_POSITION == itemPosition) itemPosition = 0; - RecyclerView.ViewHolder vh = recyclerView.findViewHolderForAdapterPosition(itemPosition); - if (null != vh && autoSelectView) { + if (mRecyclerView.getChildCount() > 0) { + mRecyclerView.getViewTreeObserver().removeOnPreDrawListener(this); + int position = mForecastAdapter.getSelectedItemPosition(); + if (position == RecyclerView.NO_POSITION && + -1 != mInitialSelectedDate) { + Cursor data = mForecastAdapter.getCursor(); + int count = data.getCount(); + int dateColumn = data.getColumnIndex(WeatherContract.WeatherEntry.COLUMN_DATE); + for (int i = 0; i < count; i++) { + data.moveToPosition(i); + if (data.getLong(dateColumn) == mInitialSelectedDate) { + position = i; + break; + } + } + } + if (position == RecyclerView.NO_POSITION) position = 0; + // If we don't need to restart the loader, and there's a desired position to restore + // to, do so now. + mRecyclerView.smoothScrollToPosition(position); + RecyclerView.ViewHolder vh = mRecyclerView.findViewHolderForAdapterPosition(position); + if (null != vh && mAutoSelectView) { mForecastAdapter.selectView(vh); } - if (sharedTransition) getActivity().supportStartPostponedEnterTransition(); + if (mHoldForTransition) { + getActivity().supportStartPostponedEnterTransition(); + } return true; } return false; @@ -230,39 +338,57 @@ public boolean onPreDraw() { } + @Override + public void onDestroy() { + super.onDestroy(); + if (null != mRecyclerView) { + mRecyclerView.clearOnScrollListeners(); + } + } + @Override public void onLoaderReset(Loader loader) { mForecastAdapter.swapCursor(null); } + public void setUseTodayLayout(boolean useTodayLayout) { + mUseTodayLayout = useTodayLayout; + if (mForecastAdapter != null) { + mForecastAdapter.setUseTodayLayout(mUseTodayLayout); + } + } - // since we read the location when we create the loader, all we need to do is restart things - public void onLocationChanged() { - getLoaderManager().restartLoader(MY_LOADER_ID, null, this); + public void setInitialSelectedDate(long initialSelectedDate) { + mInitialSelectedDate = initialSelectedDate; } + /* + Updates the empty list view with contextually relevant information that the user can + use to determine why they aren't seeing weather. + */ private void updateEmptyView() { if (mForecastAdapter.getItemCount() == 0) { - mEmptyView = (TextView) getView().findViewById(R.id.recyclerView_forecast_empty); - if (mEmptyView != null) { + TextView tv = (TextView) getView().findViewById(R.id.recyclerView_forecast_empty); + if (null != tv) { + // if cursor is empty, why? do we have an invalid location int message = R.string.empty_forecast_list; - @LocationStatus int status = Utility.getLocationStatus(getContext()); - switch (status) { - case LOCATION_STATUS_SERVER_DOWN: + @SunshineSyncAdapter.LocationStatus int location = Utility.getLocationStatus(getActivity()); + switch (location) { + case SunshineSyncAdapter.LOCATION_STATUS_SERVER_DOWN: message = R.string.empty_forecast_list_server_down; break; - case LOCATION_STATUS_SERVER_INVALID: + case SunshineSyncAdapter.LOCATION_STATUS_SERVER_INVALID: message = R.string.empty_forecast_list_server_error; break; - case LOCATION_STATUS_INVALID: + case SunshineSyncAdapter.LOCATION_STATUS_INVALID: message = R.string.empty_forecast_list_invalid_location; break; default: - if (!Utility.isNetworkAvailable(getContext())) { + if (!Utility.isNetworkAvailable(getActivity())) { message = R.string.empty_forecast_list_no_network; } } - mEmptyView.setText(message); + tv.setText(message); } } } @@ -274,16 +400,6 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin } } - @Override - public void onClick(Long date, ForecastAdapter.ViewHolder viewHolder) { - String locationSetting = Utility.getPreferredLocation(getActivity()); - ((Callback) getActivity()).onItemSelected( - WeatherContract.WeatherEntry.buildWeatherLocationWithDate(locationSetting, date) - , viewHolder - ); - mPosition = viewHolder.getAdapterPosition(); - } - /** * A callback interface that all activities containing this fragment must * implement. This mechanism allows activities to be notified of item @@ -293,7 +409,6 @@ public interface Callback { /** * DetailFragmentCallback for when an item has been selected. */ - public void onItemSelected(Uri dateUri, ForecastAdapter.ViewHolder viewHolder); + void onItemSelected(Uri dateUri, ForecastAdapter.ViewHolder vh); } - -} +} \ No newline at end of file diff --git a/app/src/main/java/com/calgen/prodek/sunshine_v2/Utility.java b/app/src/main/java/com/calgen/prodek/sunshine_v2/Utility.java index c19976b..79c7c82 100644 --- a/app/src/main/java/com/calgen/prodek/sunshine_v2/Utility.java +++ b/app/src/main/java/com/calgen/prodek/sunshine_v2/Utility.java @@ -68,7 +68,7 @@ public static String formatDate(long dateInMillis) { * @param dateInMillis The date in milliseconds * @return a user-friendly representation of the date. */ - public static String getFriendlyDayString(Context context, long dateInMillis) { + public static String getFriendlyDayString(Context context, long dateInMillis, boolean displayLongToday) { // The day string for forecast uses the following logic: // For today: "Today, June 8" // For tomorrow: "Tomorrow" @@ -83,7 +83,7 @@ public static String getFriendlyDayString(Context context, long dateInMillis) { // If the date we're building the String for is today's date, the format // is "Today, June 24" - if (julianDay == currentJulianDay) { + if (julianDay == currentJulianDay && displayLongToday) { String today = context.getString(R.string.today); int formatId = R.string.format_full_friendly_date; return context.getString( @@ -559,4 +559,40 @@ public static String getStringForWeatherCondition(Context context, int weatherId return context.getString(stringId); } + /* + * Helper method to provide the correct image according to the weather condition id returned + * by the OpenWeatherMap call. + * + * @param weatherId from OpenWeatherMap API response + * @return A string URL to an appropriate image or null if no mapping is found + */ + public static String getImageUrlForWeatherCondition(int weatherId) { + // Based on weather code data found at: + // http://bugs.openweathermap.org/projects/api/wiki/Weather_Condition_Codes + if (weatherId >= 200 && weatherId <= 232) { + return "http://upload.wikimedia.org/wikipedia/commons/2/28/Thunderstorm_in_Annemasse,_France.jpg"; + } else if (weatherId >= 300 && weatherId <= 321) { + return "http://upload.wikimedia.org/wikipedia/commons/a/a0/Rain_on_leaf_504605006.jpg"; + } else if (weatherId >= 500 && weatherId <= 504) { + return "http://upload.wikimedia.org/wikipedia/commons/6/6c/Rain-on-Thassos.jpg"; + } else if (weatherId == 511) { + return "http://upload.wikimedia.org/wikipedia/commons/b/b8/Fresh_snow.JPG"; + } else if (weatherId >= 520 && weatherId <= 531) { + return "http://upload.wikimedia.org/wikipedia/commons/6/6c/Rain-on-Thassos.jpg"; + } else if (weatherId >= 600 && weatherId <= 622) { + return "http://upload.wikimedia.org/wikipedia/commons/b/b8/Fresh_snow.JPG"; + } else if (weatherId >= 701 && weatherId <= 761) { + return "http://upload.wikimedia.org/wikipedia/commons/e/e6/Westminster_fog_-_London_-_UK.jpg"; + } else if (weatherId == 761 || weatherId == 781) { + return "http://upload.wikimedia.org/wikipedia/commons/d/dc/Raised_dust_ahead_of_a_severe_thunderstorm_1.jpg"; + } else if (weatherId == 800) { + return "http://upload.wikimedia.org/wikipedia/commons/7/7e/A_few_trees_and_the_sun_(6009964513).jpg"; + } else if (weatherId == 801) { + return "http://upload.wikimedia.org/wikipedia/commons/e/e7/Cloudy_Blue_Sky_(5031259890).jpg"; + } else if (weatherId >= 802 && weatherId <= 804) { + return "http://upload.wikimedia.org/wikipedia/commons/5/54/Cloudy_hills_in_Elis,_Greece_2.jpg"; + } + return null; + } + } diff --git a/app/src/main/java/com/calgen/prodek/sunshine_v2/adapter/ForecastAdapter.java b/app/src/main/java/com/calgen/prodek/sunshine_v2/adapter/ForecastAdapter.java index 30fe8c7..3031267 100644 --- a/app/src/main/java/com/calgen/prodek/sunshine_v2/adapter/ForecastAdapter.java +++ b/app/src/main/java/com/calgen/prodek/sunshine_v2/adapter/ForecastAdapter.java @@ -74,12 +74,16 @@ public void onBindViewHolder(ViewHolder holder, int position) { int weatherId = cursor.getInt(ForecastFragment.COL_WEATHER_CONDITION_ID); int defaultImage; - switch (getItemViewType(cursor.getPosition())) { + boolean useLongToday; + + switch (getItemViewType(position)) { case VIEW_TYPE_TODAY: defaultImage = Utility.getArtResourceForWeatherCondition(weatherId); + useLongToday = true; break; default: defaultImage = Utility.getIconResourceForWeatherCondition(weatherId); + useLongToday = false; } Glide.with(mContext) @@ -92,7 +96,7 @@ public void onBindViewHolder(ViewHolder holder, int position) { // Read date from cursor long dateInMillis = cursor.getLong(ForecastFragment.COL_WEATHER_DATE); // Find TextView and set formatted date on it - holder.mDateView.setText(Utility.getFriendlyDayString(mContext, dateInMillis)); + holder.mDateView.setText(Utility.getFriendlyDayString(mContext, dateInMillis, useLongToday)); // Read weather forecast from cursor String description = Utility.getStringForWeatherCondition(mContext, weatherId); diff --git a/app/src/main/java/com/calgen/prodek/sunshine_v2/customView/LocationEditText.java b/app/src/main/java/com/calgen/prodek/sunshine_v2/customView/LocationEditText.java index d14a325..b913926 100644 --- a/app/src/main/java/com/calgen/prodek/sunshine_v2/customView/LocationEditText.java +++ b/app/src/main/java/com/calgen/prodek/sunshine_v2/customView/LocationEditText.java @@ -9,10 +9,15 @@ import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; +import android.widget.Toast; import com.calgen.prodek.sunshine_v2.R; +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GoogleApiAvailability; /** * Created by Gurupad Mamadapur on 11/8/2016. @@ -37,8 +42,34 @@ public LocationEditText(Context context, AttributeSet attrs) { } finally { array.recycle(); } + + // Check to see if Google Play services is available. The Place Picker API is available + // through Google Play services, so if this is false, we'll just carry on as though this + // feature does not exist. If it is true, however, we can add a widget to our preference. + GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); + int resultCode = apiAvailability.isGooglePlayServicesAvailable(getContext()); + if (resultCode == ConnectionResult.SUCCESS) { + // Add the get current location widget to our location preference + setWidgetLayoutResource(R.layout.pref_current_location); + } + } + + @Override + protected View onCreateView(ViewGroup parent) { + View view = super.onCreateView(parent); + View currentLocation = view.findViewById(R.id.current_location); + currentLocation.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // We'll use a toast for now so that we can test our new preference widget. + Toast.makeText(getContext(), "Woo!", Toast.LENGTH_LONG).show(); + } + }); + + return view; } + @Override protected void showDialog(Bundle state) { super.showDialog(state); diff --git a/app/src/main/java/com/calgen/prodek/sunshine_v2/muzei/WeatherMuzeiSource.java b/app/src/main/java/com/calgen/prodek/sunshine_v2/muzei/WeatherMuzeiSource.java new file mode 100644 index 0000000..1f53d89 --- /dev/null +++ b/app/src/main/java/com/calgen/prodek/sunshine_v2/muzei/WeatherMuzeiSource.java @@ -0,0 +1,64 @@ +package com.calgen.prodek.sunshine_v2.muzei; + +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; + +import com.calgen.prodek.sunshine_v2.Utility; +import com.calgen.prodek.sunshine_v2.activity.MainActivity; +import com.calgen.prodek.sunshine_v2.data.WeatherContract; +import com.calgen.prodek.sunshine_v2.sync.SunshineSyncAdapter; +import com.google.android.apps.muzei.api.Artwork; +import com.google.android.apps.muzei.api.MuzeiArtSource; + +/** + * Muzei source that changes your background based on the current weather conditions + */ +public class WeatherMuzeiSource extends MuzeiArtSource { + private static final String[] FORECAST_COLUMNS = new String[]{ + WeatherContract.WeatherEntry.COLUMN_WEATHER_ID, + WeatherContract.WeatherEntry.COLUMN_SHORT_DESC + }; + // these indices must match the projection + private static final int INDEX_WEATHER_ID = 0; + private static final int INDEX_SHORT_DESC = 1; + + public WeatherMuzeiSource() { + super("WeatherMuzeiSource"); + } + + @Override + protected void onHandleIntent(Intent intent) { + super.onHandleIntent(intent); + boolean dataUpdated = intent != null && + SunshineSyncAdapter.ACTION_DATA_UPDATED.equals(intent.getAction()); + if (dataUpdated && isEnabled()) { + onUpdate(UPDATE_REASON_OTHER); + } + } + + @Override + protected void onUpdate(int reason) { + String location = Utility.getPreferredLocation(this); + Uri weatherForLocationUri = WeatherContract.WeatherEntry.buildWeatherLocationWithStartDate( + location, System.currentTimeMillis()); + Cursor cursor = getContentResolver().query(weatherForLocationUri, FORECAST_COLUMNS, null, + null, WeatherContract.WeatherEntry.COLUMN_DATE + " ASC"); + if (cursor.moveToFirst()) { + int weatherId = cursor.getInt(INDEX_WEATHER_ID); + String desc = cursor.getString(INDEX_SHORT_DESC); + + String imageUrl = Utility.getImageUrlForWeatherCondition(weatherId); + // Only publish a new wallpaper if we have a valid image + if (imageUrl != null) { + publishArtwork(new Artwork.Builder() + .imageUri(Uri.parse(imageUrl)) + .title(desc) + .byline(location) + .viewIntent(new Intent(this, MainActivity.class)) + .build()); + } + } + cursor.close(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/calgen/prodek/sunshine_v2/sync/SunshineSyncAdapter.java b/app/src/main/java/com/calgen/prodek/sunshine_v2/sync/SunshineSyncAdapter.java index 8dc82c3..e6a7b0d 100644 --- a/app/src/main/java/com/calgen/prodek/sunshine_v2/sync/SunshineSyncAdapter.java +++ b/app/src/main/java/com/calgen/prodek/sunshine_v2/sync/SunshineSyncAdapter.java @@ -35,6 +35,7 @@ import com.calgen.prodek.sunshine_v2.Utility; import com.calgen.prodek.sunshine_v2.activity.MainActivity; import com.calgen.prodek.sunshine_v2.data.WeatherContract; +import com.calgen.prodek.sunshine_v2.muzei.WeatherMuzeiSource; import org.json.JSONArray; import org.json.JSONException; @@ -63,6 +64,7 @@ public class SunshineSyncAdapter extends AbstractThreadedSyncAdapter { public static final int LOCATION_STATUS_SERVER_INVALID = 2; public static final int LOCATION_STATUS_UNKNOWN = 3; public static final int LOCATION_STATUS_INVALID = 4; + public static final String ACTION_DATA_UPDATED = "com.calgen.prodek.sunshine_v2.ACTION_DATA_UPDATED"; private static final long DAY_IN_MILLIS = 1000 * 60 * 60 * 24; private static final int WEATHER_NOTIFICATION_ID = 3004; private static final String[] NOTIFY_WEATHER_PROJECTION = new String[]{ @@ -447,6 +449,8 @@ private void getWeatherDataFromJson(String forecastJsonStr, WeatherContract.WeatherEntry.COLUMN_DATE + " <= ?", new String[]{Long.toString(dayTime.setJulianDay(julianStartDay - 1))}); + updateWidgets(); + updateMuzei(); notifyWeather(); } Log.d(LOG_TAG, "Sync Complete. " + cVVector.size() + " Inserted"); @@ -459,6 +463,24 @@ private void getWeatherDataFromJson(String forecastJsonStr, } } + private void updateWidgets() { + Context context = getContext(); + Intent intent = new Intent(ACTION_DATA_UPDATED) + .setPackage(context.getPackageName()); + context.sendBroadcast(intent); + } + + private void updateMuzei() { + // Muzei is only compatible with Jelly Bean MR1+ devices, so there's no need to update the + // Muzei background on lower API level devices + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + Context context = getContext(); + context.startService(new Intent(ACTION_DATA_UPDATED) + .setClass(context, WeatherMuzeiSource.class)); + } + } + + private void notifyWeather() { Context context = getContext(); //checking the last update and notify if it' the first of the day diff --git a/app/src/main/java/com/calgen/prodek/sunshine_v2/widget/DetailWidgetProvider.java b/app/src/main/java/com/calgen/prodek/sunshine_v2/widget/DetailWidgetProvider.java new file mode 100644 index 0000000..273a20d --- /dev/null +++ b/app/src/main/java/com/calgen/prodek/sunshine_v2/widget/DetailWidgetProvider.java @@ -0,0 +1,89 @@ +package com.calgen.prodek.sunshine_v2.widget; + +import android.annotation.TargetApi; +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.support.annotation.NonNull; +import android.support.v4.app.TaskStackBuilder; +import android.widget.RemoteViews; + +import com.calgen.prodek.sunshine_v2.R; +import com.calgen.prodek.sunshine_v2.activity.DetailActivity; +import com.calgen.prodek.sunshine_v2.activity.MainActivity; +import com.calgen.prodek.sunshine_v2.sync.SunshineSyncAdapter; + +/** + * Created by Gurupad Mamadapur on 11/23/2016. + */ +public class DetailWidgetProvider extends AppWidgetProvider { + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + // Perform this loop procedure for each App Widget that belongs to this provider + for (int appWidgetId : appWidgetIds) { + RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_detail); + + // Create an Intent to launch MainActivity + Intent intent = new Intent(context, MainActivity.class); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); + views.setOnClickPendingIntent(R.id.widget, pendingIntent); + + // Set up the collection + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + setRemoteAdapter(context, views); + } else { + setRemoteAdapterV11(context, views); + } + boolean useDetailActivity = context.getResources() + .getBoolean(R.bool.use_detail_activity); + Intent clickIntentTemplate = useDetailActivity + ? new Intent(context, DetailActivity.class) + : new Intent(context, MainActivity.class); + PendingIntent clickPendingIntentTemplate = TaskStackBuilder.create(context) + .addNextIntentWithParentStack(clickIntentTemplate) + .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); + views.setPendingIntentTemplate(R.id.widget_list, clickPendingIntentTemplate); + views.setEmptyView(R.id.widget_list, R.id.widget_empty); + + // Tell the AppWidgetManager to perform an update on the current app widget + appWidgetManager.updateAppWidget(appWidgetId, views); + } + } + + @Override + public void onReceive(@NonNull Context context, @NonNull Intent intent) { + super.onReceive(context, intent); + if (SunshineSyncAdapter.ACTION_DATA_UPDATED.equals(intent.getAction())) { + AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); + int[] appWidgetIds = appWidgetManager.getAppWidgetIds( + new ComponentName(context, getClass())); + appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_list); + } + } + + /** + * Sets the remote adapter used to fill in the list items + * + * @param views RemoteViews to set the RemoteAdapter + */ + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) + private void setRemoteAdapter(Context context, @NonNull final RemoteViews views) { + views.setRemoteAdapter(R.id.widget_list, + new Intent(context, DetailWidgetRemoteViewsService.class)); + } + + /** + * Sets the remote adapter used to fill in the list items + * + * @param views RemoteViews to set the RemoteAdapter + */ + @SuppressWarnings("deprecation") + private void setRemoteAdapterV11(Context context, @NonNull final RemoteViews views) { + views.setRemoteAdapter(0, R.id.widget_list, + new Intent(context, DetailWidgetRemoteViewsService.class)); + } + +} diff --git a/app/src/main/java/com/calgen/prodek/sunshine_v2/widget/DetailWidgetRemoteViewsService.java b/app/src/main/java/com/calgen/prodek/sunshine_v2/widget/DetailWidgetRemoteViewsService.java new file mode 100644 index 0000000..552ee3f --- /dev/null +++ b/app/src/main/java/com/calgen/prodek/sunshine_v2/widget/DetailWidgetRemoteViewsService.java @@ -0,0 +1,176 @@ +package com.calgen.prodek.sunshine_v2.widget; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Binder; +import android.os.Build; +import android.support.annotation.RequiresApi; +import android.util.Log; +import android.widget.AdapterView; +import android.widget.RemoteViews; +import android.widget.RemoteViewsService; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.Target; +import com.calgen.prodek.sunshine_v2.R; +import com.calgen.prodek.sunshine_v2.Utility; +import com.calgen.prodek.sunshine_v2.data.WeatherContract; + +import java.util.concurrent.ExecutionException; + +/** + * Created by Gurupad Mamadapur on 11/23/2016. + */ +@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) +public class DetailWidgetRemoteViewsService extends RemoteViewsService { + @Override + public RemoteViewsFactory onGetViewFactory(Intent intent) { + return new ListRemoteViewFactory(getApplicationContext()); + } + + + private class ListRemoteViewFactory implements RemoteViewsService.RemoteViewsFactory { + + // these indices must match the projection + static final int INDEX_WEATHER_ID = 0; + static final int INDEX_WEATHER_DATE = 1; + static final int INDEX_WEATHER_CONDITION_ID = 2; + static final int INDEX_WEATHER_DESC = 3; + static final int INDEX_WEATHER_MAX_TEMP = 4; + static final int INDEX_WEATHER_MIN_TEMP = 5; + private final String[] FORECAST_COLUMNS = { + WeatherContract.WeatherEntry.TABLE_NAME + "." + WeatherContract.WeatherEntry._ID, + WeatherContract.WeatherEntry.COLUMN_DATE, + WeatherContract.WeatherEntry.COLUMN_WEATHER_ID, + WeatherContract.WeatherEntry.COLUMN_SHORT_DESC, + WeatherContract.WeatherEntry.COLUMN_MAX_TEMP, + WeatherContract.WeatherEntry.COLUMN_MIN_TEMP + }; + private final String LOG_TAG = ListRemoteViewFactory.class.getSimpleName(); + Context context; + private Cursor data = null; + + ListRemoteViewFactory(Context applicationContext) { + context = applicationContext; + } + + @Override + public void onCreate() { + } + + @Override + public void onDataSetChanged() { + if (data != null) { + data.close(); + } + + final long identityToken = Binder.clearCallingIdentity(); + String location = Utility.getPreferredLocation(context); + Uri weatherForLocationUri = WeatherContract.WeatherEntry + .buildWeatherLocationWithStartDate(location, System.currentTimeMillis()); + data = getContentResolver().query(weatherForLocationUri, + FORECAST_COLUMNS, + null, + null, + WeatherContract.WeatherEntry.COLUMN_DATE + " ASC"); + Binder.restoreCallingIdentity(identityToken); + } + + @Override + public void onDestroy() { + if (data != null) { + data.close(); + data = null; + } + } + + @Override + public int getCount() { + return data == null ? 0 : data.getCount(); + } + + @Override + public RemoteViews getViewAt(int position) { + if (position == AdapterView.INVALID_POSITION || + data == null || !data.moveToPosition(position)) { + return null; + } + RemoteViews views = new RemoteViews(getPackageName(), + R.layout.widget_list_item); + int weatherId = data.getInt(INDEX_WEATHER_CONDITION_ID); + int weatherArtResourceId = Utility.getIconResourceForWeatherCondition(weatherId); + String weatherArtResourceUrl = Utility.getArtUrlForWeatherCondition(context, weatherId); + Bitmap weatherArtImage = null; + try { + weatherArtImage = Glide.with(context) + .load(weatherArtResourceUrl) + .asBitmap() + .error(weatherArtResourceId) + .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get(); + } catch (InterruptedException | ExecutionException e) { + Log.e(LOG_TAG, "Error retrieving large icon from " + weatherArtResourceUrl, e); + } + String description = data.getString(INDEX_WEATHER_DESC); + long dateInMillis = data.getLong(INDEX_WEATHER_DATE); + String formattedDate = Utility.getFriendlyDayString(context, dateInMillis, false); + double maxTemp = data.getDouble(INDEX_WEATHER_MAX_TEMP); + double minTemp = data.getDouble(INDEX_WEATHER_MIN_TEMP); + String formattedMaxTemperature = Utility.formatTemperature(context, maxTemp); + String formattedMinTemperature = Utility.formatTemperature(context, minTemp); + + if (weatherArtImage != null) { + views.setImageViewBitmap(R.id.widget_icon, weatherArtImage); + } else { + views.setImageViewResource(R.id.widget_icon, weatherArtResourceId); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { + setRemoteContentDescription(views, description); + } + views.setTextViewText(R.id.widget_date, formattedDate); + views.setTextViewText(R.id.widget_description, description); + views.setTextViewText(R.id.widget_high_temperature, formattedMaxTemperature); + views.setTextViewText(R.id.widget_low_temperature, formattedMinTemperature); + + final Intent fillInIntent = new Intent(); + String locationSetting = + Utility.getPreferredLocation(context); + Uri weatherUri = WeatherContract.WeatherEntry.buildWeatherLocationWithDate( + locationSetting, + dateInMillis); + fillInIntent.setData(weatherUri); + views.setOnClickFillInIntent(R.id.widget_list_item, fillInIntent); + return views; + } + + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) + private void setRemoteContentDescription(RemoteViews views, String description) { + views.setContentDescription(R.id.widget_icon, description); + } + + @Override + public RemoteViews getLoadingView() { + return new RemoteViews(getPackageName(), R.layout.widget_list_item); + } + + @Override + public int getViewTypeCount() { + return 1; + } + + @Override + public long getItemId(int position) { + if (data.moveToPosition(position)) + return data.getLong(INDEX_WEATHER_ID); + return position; + } + + @Override + public boolean hasStableIds() { + return true; + } + } +} diff --git a/app/src/main/java/com/calgen/prodek/sunshine_v2/widget/TodayWidgetIntentService.java b/app/src/main/java/com/calgen/prodek/sunshine_v2/widget/TodayWidgetIntentService.java new file mode 100644 index 0000000..5ad0d64 --- /dev/null +++ b/app/src/main/java/com/calgen/prodek/sunshine_v2/widget/TodayWidgetIntentService.java @@ -0,0 +1,138 @@ +package com.calgen.prodek.sunshine_v2.widget; + +import android.annotation.TargetApi; +import android.app.IntentService; +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.content.ComponentName; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.util.DisplayMetrics; +import android.util.TypedValue; +import android.widget.RemoteViews; + +import com.calgen.prodek.sunshine_v2.R; +import com.calgen.prodek.sunshine_v2.Utility; +import com.calgen.prodek.sunshine_v2.activity.MainActivity; +import com.calgen.prodek.sunshine_v2.data.WeatherContract; + +/** + * IntentService which handles updating all Today widgets with the latest data + */ +public class TodayWidgetIntentService extends IntentService { + + private static final String[] FORECAST_COLUMNS = { + WeatherContract.WeatherEntry.COLUMN_WEATHER_ID, + WeatherContract.WeatherEntry.COLUMN_SHORT_DESC, + WeatherContract.WeatherEntry.COLUMN_MAX_TEMP, + WeatherContract.WeatherEntry.COLUMN_MIN_TEMP + }; + // these indices must match the projection + private static final int INDEX_WEATHER_ID = 0; + private static final int INDEX_SHORT_DESC = 1; + private static final int INDEX_MAX_TEMP = 2; + private static final int INDEX_MIN_TEMP = 3; + + + public TodayWidgetIntentService() { + super("TodayWidgetIntentService"); + } + + @Override + protected void onHandleIntent(Intent intent) { + // Retrieve all of the Today widget ids: these are the widgets we need to update + AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); + int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(this, + TodayWidgetProvider.class)); + + // Get today's data from the ContentProvider + String location = Utility.getPreferredLocation(this); + Uri weatherForLocationUri = WeatherContract.WeatherEntry.buildWeatherLocationWithStartDate( + location, System.currentTimeMillis()); + Cursor data = getContentResolver().query(weatherForLocationUri, FORECAST_COLUMNS, null, + null, WeatherContract.WeatherEntry.COLUMN_DATE + " ASC"); + if (data == null) { + return; + } + if (!data.moveToFirst()) { + data.close(); + return; + } + + // Extract the weather data from the Cursor + int weatherId = data.getInt(INDEX_WEATHER_ID); + int weatherArtResourceId = Utility.getArtResourceForWeatherCondition(weatherId); + String description = data.getString(INDEX_SHORT_DESC); + double maxTemp = data.getDouble(INDEX_MAX_TEMP); + String formattedMaxTemperature = Utility.formatTemperature(this, maxTemp); + double minTemp = data.getDouble(INDEX_MIN_TEMP); + String formattedMinTemperature = Utility.formatTemperature(this, minTemp); + data.close(); + + // Perform this loop procedure for each Today widget + for (int appWidgetId : appWidgetIds) { + // Find the correct layout based on the widget's width + int widgetWidth = getWidgetWidth(appWidgetManager, appWidgetId); + int defaultWidth = getResources().getDimensionPixelSize(R.dimen.widget_default_width); + int largeWidth = getResources().getDimensionPixelSize(R.dimen.widget_large_width); + int layoutId; + if (widgetWidth >= largeWidth) { + layoutId = R.layout.widget_today_large; + } else if (widgetWidth >= defaultWidth) { + layoutId = R.layout.widget_today; + } else { + layoutId = R.layout.widget_today_small; + } + RemoteViews views = new RemoteViews(getPackageName(), layoutId); + + // Add the data to the RemoteViews + views.setImageViewResource(R.id.widget_icon, weatherArtResourceId); + // Content Descriptions for RemoteViews were only added in ICS MR1 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { + setRemoteContentDescription(views, description); + } + views.setTextViewText(R.id.widget_high_temp, formattedMaxTemperature); + views.setTextViewText(R.id.widget_low_temp, formattedMinTemperature); + views.setTextViewText(R.id.widget_description, description); + + // Create an Intent to launch MainActivity + Intent launchIntent = new Intent(this, MainActivity.class); + PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, launchIntent, 0); + views.setOnClickPendingIntent(R.id.widget, pendingIntent); + + // Tell the AppWidgetManager to perform an update on the current app widget + appWidgetManager.updateAppWidget(appWidgetId, views); + } + } + + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) + private void setRemoteContentDescription(RemoteViews views, String description) { + views.setContentDescription(R.id.widget_icon, description); + } + + private int getWidgetWidth(AppWidgetManager appWidgetManager, int appWidgetId) { + // Prior to Jelly Bean, widgets were always their default size + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { + return getResources().getDimensionPixelSize(R.dimen.widget_default_width); + } + // For Jelly Bean and higher devices, widgets can be resized - the current size can be + // retrieved from the newly added App Widget Options + return getWidgetWidthFromOptions(appWidgetManager, appWidgetId); + } + + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) + private int getWidgetWidthFromOptions(AppWidgetManager appWidgetManager, int appWidgetId) { + Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId); + if (options.containsKey(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH)) { + int minWidthDp = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH); + // The width returned is in dp, but we'll convert it to pixels to match the other widths + DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, minWidthDp, + displayMetrics); + } + return getResources().getDimensionPixelSize(R.dimen.widget_default_width); + } +} diff --git a/app/src/main/java/com/calgen/prodek/sunshine_v2/widget/TodayWidgetProvider.java b/app/src/main/java/com/calgen/prodek/sunshine_v2/widget/TodayWidgetProvider.java new file mode 100644 index 0000000..4fd5f67 --- /dev/null +++ b/app/src/main/java/com/calgen/prodek/sunshine_v2/widget/TodayWidgetProvider.java @@ -0,0 +1,38 @@ +package com.calgen.prodek.sunshine_v2.widget; + +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.NonNull; + +import com.calgen.prodek.sunshine_v2.sync.SunshineSyncAdapter; + +/** + * Created by Gurupad Mamadapur on 11/19/2016. + */ + +public class TodayWidgetProvider extends AppWidgetProvider { + + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + super.onUpdate(context, appWidgetManager, appWidgetIds); + context.startService(new Intent(context, TodayWidgetIntentService.class)); + } + + + @Override + public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, + int appWidgetId, Bundle newOptions) { + context.startService(new Intent(context, TodayWidgetIntentService.class)); + } + + @Override + public void onReceive(@NonNull Context context, @NonNull Intent intent) { + super.onReceive(context, intent); + if (SunshineSyncAdapter.ACTION_DATA_UPDATED.equals(intent.getAction())) { + context.startService(new Intent(context, TodayWidgetIntentService.class)); + } + } +} diff --git a/app/src/main/res/drawable-hdpi/ic_my_location_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_my_location_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..19ee9e902abaa9af83932ca6e52f34d5ca6a25eb GIT binary patch literal 648 zcmV;30(bq1P)ZFKBx6()v`aja7 zNZsDR3m%UdcV~BtJ$U%Q!pwVqnR&m)74t2*;wQXtk_66>q#pzcAtrLR6hznn_JKPh zNPMS&=zj?c0$HF5OoDyl>Li8u@B2+FdUkzG>=I0T-6G4P2&o(IB;xEd3`2Ree9#PD3Ua-AYw<*K5^QUtRHF=#UqLRD_P%D38Ete z?M+t_hff-Ux)S>uS+DcaMb@z?C5gkahM9GQGla3bi_rJ%AMK{{8~(-8FR^vWnH zR>1grUPDk$V&5n0hMg>n;yhzwit>6AwmF6jBxxUKX}@l_FgA$eqM|SkEyT#CfeP7k zuT!Zr#Bii=9>zM;#o(P_%;Y2|^LsiU#BW-+xzf9CV}o?lTpw9|3h0g>32Ys|PHr5E z5;nJN{Md0ipq;YV=qQ?|ia0wN!Li#Bw#poiv0%n5gj86}2rj%D@=qkso;fzk8VW4q zcV9B(PpwYI$unpd3#INesJkd;+&&ZoIO#oLVN;3t!a9>yWz%0gr6V}c)LCybWEFV% i?}wiR`R)%ZPx%4900s&Xc>BKq0000mjvrslHtRyv*ui!GJSScGDrP#2*7m#91tS#6od0Q$w z%pi@I~nx}qsJDdAE_nzmR|Gkb<$|)zDiclE{rNJ?HC5}KUDxq=k zseaZ67?T!i00k9XPoQ2>XiA0Gq@>USLug(~CnieEDvw z7xjBUmyO!$vKlZ4ioP3asZG#GPb?2!z%w`meYWc+Nt&IJdibJ)kU-R z*B!{vg8uWPLoc@6FYjKDtr+X#4J?6Ln`c>0@oE=z*gjm743P^kD0SL<3?WZ4eqw4<7}2bMv}H&&vtI*ACYJ8lNdf?nUaekuos>^)_m zn2In{4}&X1?9`AK5Bb&9nFZr;-3HCHac+QXY6gAXE)nvZz?Km|iUGM==V@0e{Be6rwMMPEd}FWO~Dpy zz{Kc#5v;kkZ4(Tc)HRBKC2a1eA-QAx!6t~0VpU>O%Ly7wUY)TpNnkF_Nz&FLh$Jtc z@Z3qT`3phJk`HPUn^*)-l6Prqk-5n|i3QwHv-k(Nki0(Q_clR?Nh=PKO2%wS#5dRC zCGgI*t+YvAFmdEDXpdYobGa%4j(sdCT8fvX_`Z$ju9sayBx?>)ohK#F4ed)?_QkJ! zuj?}JmbB}7mh|R6U$i#IKa`>&PfP3nn|v@ofiqX;O_#y200000NkvXXu0mjf9saDx literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_share_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..d3fc7ac4d266b74921b8921eaaba0b15dd18ae5a GIT binary patch literal 323 zcmV-J0lfZ+P)Jkv;3ea6zbbum9i-NT3pRwye)z-QhWW6|c2^i9d3L{8*aZNKYrC)P{8nj^x z8)(s{E1e4Q4h7h|yjO$k*hSzZ30QHS>$N0c!5Pq$1XMT!#Cz0XNvh6W(f|L@)XY1VJ#eLPP}F z7}<68izw)9s-e6TRoye)Jx0SEez0Iqb^m*+>(OJTULDW8WiqJ%nK~gAkP7(U1@r-n zz&`Ms5l{y9fCZrEwFqbc=74i%!6wdtS+wy_1WW-p77M3TfXSB>&eAY#H*Km!vhE1q_q zdlS^1u7IqIfH~&Cela|w{=Ny^0uM+HT_SII_8W7sXIuoFGqGBC(2IsxAELM*#(68* z3g}}d@6{~66eDS!XhaNN4!cs90xCSkG%2Lbnj&0H#g zp+lIg=Ge@5b0JEZJTNMZ+i(z25NwXw9Ae5IF|sU-%WE1GQyBd$*jy!JcWeYKFxfNX zF_f-p?46Ra^ELu{m>ugE#s(-b>f(Zz43f&6=Ux+KKVz zjRIzgu_tT;b)^1JUk!l zZS16?+8V@Y!$quX;A2u(i>;cQ=ny-p6|CnwFG_ZVi_Q%#svJO3f+%iWw~{UeDl zM0Fcq*X!!i>5qrSm!m|Rq&{$D@!qBsv!Dwx!%myx{7Zgf>c-oHT_Iv!;K7~O)i&uz izEnUeApK{Lx5Z!c_g|9a09NS$0000>Ye)4^qR%_zjyCB|9h^-Fbt2A@wft90nQhY3r0Z_yb=iz z0s-y!4Tm=KoSa0hl6B^F1y=r*1QsW$`>4^nh!NIzA5abhuIBSw>9U;!uW1X{2sx z7E7Q?mz}P#FucgSLPOHEgIP=Xy-84 z`gDsM^mgy)ccxoxAUA0iE1<>+lR07Xy1=E0h!-#k@|`eR6iH4{(%<6>bW0p9tJ!EZ zSe6{pGs|u(nZhLPxfnfTG2CqfCz7(eASn`yb_3r3s@Gl`C8mB+mghMQcZ)#8qU_2d z$ZfDC*8jPJfC$IYVnRW{j?)Efa}*F$5D?}lpjAOYGuJz^#UCUe<$TE(u$fjzW%py8 s?umm`DtBnZhGomfz36rYxB|ZT0I2w&U~w*_tpET307*qoM6N<$g57Eb#{d8T literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_my_location_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_my_location_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..01a9c75587816939523af5f331275bdf212289b0 GIT binary patch literal 1219 zcmV;!1U&nRP)mN`Q zA3<2;qnC(F;;w8 z2o})s0Cd2S1!MtPKo*b%WC2ANpg2$=CJgtD5LB4+x5c_uPKwmU~IjYZ~T3vUP4mjDM83SOBY7&$c z?SO)y9S`6fY8zA)jeywgeNW;-e&RRY2`UHWfc&6DlplXr0qO!x;TY=ty{aBL6>t(j z4~YwZ1*!)nyRdT#)Bu_z+8PGMdkrX-2xlJMysA64475nF`@m~JPLI_Ny7@Q_&Vbz= zEudY8HS~A|DCn@TWzbmz!CXGZM547^HVr7-!CO5Cr5H>JQbDtV^?Uc0w*L zhNT7_c>8aF_EGEjyLM29i+QgL*4d;B5Zik`3gR3YSI#!fr=Tz)mSLY60i{cZ0Ixao zE$ISOD!2%lAh6bDzV;ndBVp%)V6I{vfQAI=19grz1qtab348OLIqs_l6ep+z)=S(u zs_`;6ZagIWe`@@NF&%~A;%tPj$D<1LV_X{W&9HjwV%gC+cS}P zGb*5dj*(8HD-UY`6efDMZqE2Vm4J9hGv$P_9U3c$Z3O$3oUs#b0Ld;ehhSt}BcL&Y z{X7@*Dg)#vEO0|3pf!U1fR}(MdCk5?KzjuHJ_{&{0Z|^Y_5b-1^LmpWHN8p8y7>yi z*mjM8T1~ro*+8+2Fg8O|p!kcJZWsv^d8x(}ar}q|K#z#FpK-=FssvOJVX~Tz^&C}j z*eS(nf?dDBi{=~{Dt9yx=crK#sG4Z=8fW~5j)K`B$Jm_29Jdv~xglY1A(H(^7Ep;` z(Pfe+vfC~nt7-{57X@<_=_=au&YTt{J1Nqzo)ac|E4Cq@k?c5m%bD+;&SRfu!G*NA zIG#zzlEoNC#e1kV3<6t;uKcKO3f9@66Oa#k0{>?C2R0ITeQ;PPXtr9_eQ@Yhd|x5v zXSx&+oZT^9HPyT@DOkiTHWGNzyznx@yiHmAOO}Htnl*eU1svdPx!lVlYM`njG&{YFBZg}K;2+g-9*UI@?$&~Zm*KcT)eaT9QLaT{7fUYhHPI8w}31l3&;YpfGnVB h17!b2mj!f8^#@&Y7LEq;2r>Ww002ovPDHLkV1gR`Bs%~A literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e0767566f218a0591aef90916843be623b16cd GIT binary patch literal 899 zcmV-}1AP36P)SmMaM7i&YUs|5xDu(gHB{Y;kD_(03$bEBQN)Fc?yHMvy4QtBDwJB$ zQXjaph^AdB+KrFuB2BU5fAI{2GRd4tPPF&TJ@7%GAuwM$_wk=QNqC-@a8$-gaDtp5 zC&&qMf*MW}$bca*4N71ROo1HejENI>ds?K`>K_4^eM1=D|qC|)-w$Y#WmoD(2P}Hv!KmpL1r6q9DHG1>5b52lori2D(wSsa2g3ONn z3~13Ps9SKFe+TwyJYhB=yij~ddo?wJ(#&8hN}0j`8d$ACP=ZcpMUnKCnK6F`y|ksV z{t#!H4j_fq6R?pkx|bwyx)eKX7v$4b7LpffF1=Qa*Y6#ORxK4UFq-)8(81tawO zBuLpVC~E6@hGaC;*5yJ-9Blq}xt8&4DK5^;MW0}HL0(h$gj;5Lvd(rv<$bhUp3Hf~ z#qFpT4T8!SrjLasUDPDV=b%t7<*%`l+64KhK?a2SbH_9a^2rJax}#apsDPkh&4NY* z1m)c=R=ox_3+fXPbVReDRGl-~4{pqB^E0cL>JW5Z<3cegDjBaq&RCQK6t+JWo{G3x z9ivzzRzED@#~rgFW6nS=M{hL!&PI~954UL%I80OdQSa}AG497rG)JyZkQ3wtIYEv9 Z{s1RcX?Aqo7(W02002ovPDHLkV1o5$p!@&; literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_my_location_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_my_location_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..b7427fb180b27b2563fd5bb3a9162354d3f7b8a3 GIT binary patch literal 1722 zcmV;r21WUaP)f=ZwzFO4)xg;EerkS>Ze8ZEd| zBK`$w)yCG9xb#E?@vS zPY~cdezpt0Th0Qgu@2Y^Tm=3mI9$eGzzEO_tYrZfrV{7`t^og9aQgF@11kX;fZ(=Ubo+SY_~h@!cK3IZZoe(1t_`kkOdaPXdRqMccM#4bYD* zTlEe6FlhpGC^~-%H~>^T=n`vCD{+K`+ znD_V=U==Q&WQO)6$oU2K66!T>x^^)&vX3~=x3zh*3mC$gh?o-QkxBfW_}fnWtc_=m z5bF22F99kEedRwE7Fn+WXMraQizczkJp*jCFdoQO%nyJH9|Cj|9C5&KT_GZ%vj!1O z@pc>qmK)g7Pk7D;J_NWTF)C}&KW+kkwHV*O4K!-nBKC|QOUl3GT7Y$gU|XMN+08NS z6;Bw<#12c!p4E-u#x+C8X&SUC=8gIZ%{QSIyR*g0?sh4_#TaHj)t0-R#kwP%F+mnN z{l=95<%Enion53shkL#Q8uqmlHj|tP&`jtL(;8FFS%(7THM*h~3FF@DE(GY37;#Ob z%(EUcABHsS{83V7rwaiFBt{HsgfpIa5MW9pE%9qfnP0jPK$aq&Q7mtl$NZlTMO%9$ zrEOGh~NG zxknuea76Rai7W}h*_Na%Vdc8AznHYC9L4LD_`U^=j`Hgr?_07-@YM&s^P(}lN6B>xl7km}sN%<;5xORSbv^gN>zeVhJ3fq{e z5Ctg1{a|XI&kP>)2w}EEz1<}nS-#mNjtaF#^xH=wj55}FaC|*+oWtk&;AsdT?C$uqtEvtK;eEipBZpE8FNnVv2!`=5H0msWOkWq+|1!3E9J^BKIYwT zN6#)h3eEYqZG{&?7eKHK`|9xk96yFp%?cmB@VyEZv2=0Y&I1pQzmJ$F_5!l QivR!s07*qoM6N<$g4T8oU;qFB literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..86d26e7bba5dfb03ebce863e7f4b64a2f2ec5492 GIT binary patch literal 1203 zcmV;k1WfyhP)Z;%HlJ#F?@sUgUf=&DzfIfkwYk67`_4W0yxT(v(F3Fp3<3l| z0Du4p01yBHpff!s5D*gMiETs+(JE5WD!;as7zY9N8B3fdlEOduXX=PT2(ZIa;8c%5d^4FD5nrx(MF7dfZ)^$`*9Kig5Ui~2LgT(1rXrRX5lV2 zK!86@4h1wofIrV13U~qm{(N^R;2Q+^^V6Y#uMptR6NdsGLx4Xm4h39*fPXW|aR$V( z1_C-Wh}cW~a6I^Y{X7WhxSO?{crC(-!ze|hm_}R|;l*2GCS`+mdP8`#i=PwhJqi}PD@k_Ea)5?u<4pyy3E{xJM&GrSy z5L<|5;-#Dhl5*bWuWbsjaXpu~Z;)2TvO9XTOz)Bb=Vo55j{NHy6NrnNX=Qn+q#TDwzP8K!{6As4+OkyeH!pg^PWWfGA| zE5j0SDx`srTv{21fYEX~a2cFdZjWMG8HRvOjt4)|X=NA!8XXRPW8B(gGOf4r5d@^S zxAHp#KtRR|c#0_~y#gBW5Kgav3dd>a8ClkbfPauL-1gXWaG(7Sq8|iw&GC>*5l>~g zI|~9j!kZ}{LM+BzA*Mh;M-~V-@7w-w?|_@9hCo1yazhFHS=ILOcfxxSqBjJ1l*sKx z)oAanJQ;+Dcg!fONk`_QC%4UzTovp6$Ois0$t9Pvti!@mAAj5hwD*`MG&Y2I8e5mCX=@ZS2i>&w4lyTS(*eJSuupiWU~wBI zzh_(~zlVcc4bxW6#=1Iub(ZWu@{1Om>yPfRoYzfTcN6`E_a=RfhDbiVH3tIB($?of zy%qk?xGT%^I5*TVZ8Zsgwq!$qdD?0cH4tDgZPkq#5MVcLRgGo{aFe#Gth`4;fIr(E zN+^W@f2te`sDuE2PC68D1Ooi2hJf_47gJDrDRU?w0Rh3v&92f=99tO>7pLboVIihg z!nPg75THh##lb&;Vw^fTvYu}mH-&eO9Rz5QFYEaxgFgZrGG=6JZb_anx$_~QGc#pL zIq8#XHVKR86k*`Ie)*(Su4<1+D&-<8&-U-bfTJ-B0ssU+0Du4p01yyAegmdRfTAu| RH#7hM002ovPDHLkV1nV=5}E)2 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/detail_extras_grid.xml b/app/src/main/res/layout/detail_extras_grid.xml index e663fe4..045eb84 100644 --- a/app/src/main/res/layout/detail_extras_grid.xml +++ b/app/src/main/res/layout/detail_extras_grid.xml @@ -25,7 +25,8 @@ android:textColor="@color/detail_accent_label" app:layout_columnWeight="1" app:layout_gravity="fill" - app:layout_rowWeight="1" /> + app:layout_rowWeight="1" + tools:text="Clear"/> + tools:text="38%"/> + app:layout_rowWeight="1" + tools:text="342"/> + tools:text="995 hPa"/> + app:layout_rowWeight="1" + tools:text="3242432"/> + tools:text="4km/h NW"/> diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index a06a078..ccb5d41 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -1,32 +1,61 @@ - - - - + + - + + + + + + + + - - \ No newline at end of file + android:layout_height="match_parent" + app:layout_behavior="@string/appbar_scrolling_view_behavior"/> + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_item_forecast.xml b/app/src/main/res/layout/list_item_forecast.xml index 54e565c..0104bc4 100644 --- a/app/src/main/res/layout/list_item_forecast.xml +++ b/app/src/main/res/layout/list_item_forecast.xml @@ -3,30 +3,27 @@ android:layout_height="wrap_content" android:background="@drawable/touch_selector" android:paddingLeft="@dimen/list_item_extra_padding" - android:paddingRight="@dimen/list_item_extra_padding" - > - + android:paddingRight="@dimen/list_item_extra_padding"> + android:paddingRight="@dimen/abc_list_item_padding_horizontal_material"> - @@ -49,10 +46,10 @@ android:layout_width="@dimen/forecast_text_width" android:layout_height="wrap_content" android:layout_gravity="center" - android:gravity="right" - android:layout_marginRight="@dimen/forecast_temperature_space" android:layout_marginEnd="@dimen/forecast_temperature_space" + android:layout_marginRight="@dimen/forecast_temperature_space" android:fontFamily="sans-serif-light" + android:gravity="right" android:textColor="@color/primary_text" android:textSize="@dimen/forecast_text_size"/> @@ -61,8 +58,8 @@ android:layout_width="@dimen/forecast_text_width" android:layout_height="wrap_content" android:layout_gravity="center" - android:gravity="right" android:fontFamily="sans-serif-light" + android:gravity="right" android:textColor="@color/forecast_low_text" android:textSize="@dimen/forecast_text_size"/> diff --git a/app/src/main/res/layout/pref_current_location.xml b/app/src/main/res/layout/pref_current_location.xml new file mode 100644 index 0000000..ef51a30 --- /dev/null +++ b/app/src/main/res/layout/pref_current_location.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/widget_detail.xml b/app/src/main/res/layout/widget_detail.xml new file mode 100644 index 0000000..82bb892 --- /dev/null +++ b/app/src/main/res/layout/widget_detail.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/widget_list_item.xml b/app/src/main/res/layout/widget_list_item.xml new file mode 100644 index 0000000..a82ab1f --- /dev/null +++ b/app/src/main/res/layout/widget_list_item.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/widget_today.xml b/app/src/main/res/layout/widget_today.xml new file mode 100644 index 0000000..3d23bdb --- /dev/null +++ b/app/src/main/res/layout/widget_today.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/widget_today_large.xml b/app/src/main/res/layout/widget_today_large.xml new file mode 100644 index 0000000..eeec3c0 --- /dev/null +++ b/app/src/main/res/layout/widget_today_large.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/widget_today_small.xml b/app/src/main/res/layout/widget_today_small.xml new file mode 100644 index 0000000..98f8331 --- /dev/null +++ b/app/src/main/res/layout/widget_today_small.xml @@ -0,0 +1,36 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/detailfragment.xml b/app/src/main/res/menu/detailfragment.xml index 34d93d0..181915e 100644 --- a/app/src/main/res/menu/detailfragment.xml +++ b/app/src/main/res/menu/detailfragment.xml @@ -2,6 +2,6 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_muzei.png b/app/src/main/res/mipmap-hdpi/ic_muzei.png new file mode 100644 index 0000000000000000000000000000000000000000..3825cf80977c5a95c1fa212e3fa718f9404bdcd0 GIT binary patch literal 5779 zcmV;E7HsK>P)DE1K(ogT4K4$i47x6K z_;S?Oquzu1D%3rwJ5aZw&ZC|}J^J*iPbG(3A5}bR2R} zyF`#W60B|udL@d-wmo*=xdjL}9c3-~`@+USFd22w(PDwtMiYrZxf&h51@(`E$hPN% zB!EamF3X_T4CHbMlUz36fuMlUxq#5Su5?7M{dC67Md9q?Ms8#rO3#0XAJIK&z*rog|4bqFLXb6Ji}X zE(|##iU8rN+zl}zCrG{9F#s-d9LA%q#j}*2Y&#`59q)Zf8oW?wz-)$3<%t&tplGK6I(+-<2@UL!fGCu;j%w0LwXArqy4WMYZ zjZOV9o|prO7eojrSg9khTHSWzBMnaTml313*_@uo6A|A?EI0+Cn3b+K*-c=yQtzDx z;bwKzgS)BIrlSnsb{kK9NunYjT_KLTq{h zjpsWN|3oUMqk%%E{+@d=Py5tAoiuZ5n=;@W1{hk4I(;au1x8DEgQ}Gn{eE&qWJ%Cn|%~G(OEi2YOK^*g@ z(QCw@YfWdx=Nt`9|I=~a1`A~{z54*&ymf1bPNzROK0W)n(bAyF5oUdk)c3V?op-U><~a8NA?94lbNs$j{r&A} znl3wkGT03f*10U;Bsd!!4Xmp`8x&nO+MsbwJ?M?<{)XkVFcwNT3naC>rK|Ufg)(VD z0NwG$N7u7#X4mP#K{v;rqh0neVf7FfYh@p~{^o*(`g-2cWm zVJg{N6k%Jv1)A42NUzJ)uy6-b++FULj+?8750xs4w|?zuyV1FFVAPjvlUQ-+3E)%y zvg=$up8#9?Wfi~3M$zzrwxh7#GmO#)KNxkq1PW%#iQrl|;N5^sYmW6Mn*p4yjwLgu zQfsd>dFk2F^PYTQOJY&En7gs_vB8;C+gvcF&H^qzg}$vaKq=k=JI6mD^-2u`;%v5q z$zgt^yXftg7Hnd-Kk}fRv}N2cdnTsgs@12;+!Fff)n z6TI6klIHX_Puq704Y#OjVmCebqXF?jQayE(M>h${>uSvvJk^kwm6Ua44&`%clJ&Y8ntWA5WKC%AF*}yocZv zT9V=Q?)I)PsbG8X`xlH=0a|Rt-X!lYCE?sd#NqXX6w(p za`UwnH3(De)^ESKg=e&@fhPBAB*?R>=hD7o;97S*Slu>h2LbC0Zbm%`R+L=YO%zxu z0tWp_5OaAZdhABH`-5Ge*Ad`Pu+Z;Kz}w>y;Dquqv>?6u{D->GXHiUsu01sqhj-Am zI67W>VJ-)HTm2RU!Am(sa5#TS^^8DWgCZMkfa<#;Ir*0AxqrCrX1MLn4}#N~&%vz7 zLzz)0=b83@zT5|I&5B?%8Q@#jp9f8jy!YyDallnQjc`jU13!BCC`>3an+BT^9{a@k z;4tMuKOY5=o7Oc-Ks~Yh42*@DC4-b9jhkgmcvTbIy!FvFNhaG?=_V+$Mw+5-Dwn)+%aoN74I1eM<6ye4EKJxs|b#=VKBb+cNc*vo39k;kcK_5sk;b{vNfa6 zf8)A!U?uq_14Q$==9?e>QIDzyNwJTs^-7M+EJDT+v|#HW`J@z0J_wXsdYbhdS*bu=J7xM|)G-Sy z1Z#+`!76#4*4`#5o5rOEt4F=ob9!I^{<8l7WV6~DHXV!t&GB&0jaOD3a7UvHbm zw6V47wXJSDq{6dH1_=z-4N6>;wxZKnEj>>3MFuM+)p@nHX-$rL)#G3J<~OC+haP+o z9=P`&)oV_U&B6_rpARkW>h<9i%fT%l-GEHBdSNWVaA-{lNJo4qq-X)X(Y!d9uQ#p1 zSYX{QW01YAzTMtv1*6qaaSxlUvW-HgwD+>ceG$0zs*N=bHk?Sq4VSK~>Dpm$L}ER* z4muhDA+tEq7Ijpc3{aVg=|mvwYPpGys+>%At?JZ1*V+J$bvB5m7x$1o{`xweD|5Xz;c56q>zg~Iyx&?8S@Lv#DWV3Nkq~Ro}t}JTuK-ulKPs;kXe-n z1e9&{sxHlQAHO8eh<|xz54?4H93}%X&1*MpSPii>3y=PK4;<*9fxI9%*JeGMZyW`#$zVF4bC6(B z=2ImAWkt~-twNQ?ME#oQ8a*Cx*zFbF{BL$2kp^!??zz1|TddE{MquyBaY+x?wR^xw zsmEUjhrFub6zf%qC~_>WGLU%0y2w-&RY&7Rej*>h-c z62|;dX#(pyJQa5*ezW&Pk=&Q|sK>8Up#;o?lV~P{#7HGL(!J&PnPd#jkCP`Y!o|kD z5JS491V>sx0YBBH4iEt%Ulv3NY#QPd{d2aO2%{dVAkeES0`%;@6VkwO?_Hr?J{dvm zIW#m4vTK4%yVU{eL+mjiX8q&U>*3P1twjwY$bue`#YN!KacCxo;Ts)~z`Y$mg|A=o z6uNtE9>aySRyLo@W|*>>PaXUdy2V`J7aKoW5r8#a+5$a+1o_msPhQo^0R3@)Kl%sbB(raOX$hrYm~j-pw0;lz{>Hvoe*yfKrhg+<$=k9FHK7M)Ijq%Sre^ z+p$uBcseXsK*|9UnbI^plZ=4>#G61_=5!)Ddc3j+>(XY>u6NGlJq;SX4rTbgD;w3z zph*Vy4@?zx<+8Qf>EV|@aS5zz%LlF=rv=*T?J_t-5uA0FQ}ES}Z^K8OyHH*yLOhiN zPRL`hwfE)uCgW8Cq%Q$49UV2ns^Wg{%%SZFwJb_G@&Jhf2l2`NMKMS~F~;s=qp~g_ zAe-x@7)Pz`JaQJLE4gB@dP%o-s-e`d|9<@h%tX>f?Qv5fxDm1D0_zb8?1CiWo_cK>vQZew|M9&@lmy8&61x0liK&5# zgIwFaM)TaH*H;q6tzV^HnT)0xh@{w}IInH32NPAf68T);Fg)|t8A)(A+7H2XuIIr? z#bjXe-$#Kd&YXtp>YsyF!*n6) zRb>r8`LQ%hNK(R~{AB3ROCyCuwTwYnm+9ct0X8zT1)EqNAe-#|#ES8cq(2%l(9rM* zy!h%)AXZ)~ji{%+0n94;LuYt+q3=vd&=*asKOm0tvL|;Qhm!+G;J%h^&}BX&PnysK zLhD$Fb|HPu02iCan!;%TglWYmr_Su;=-8HGVk(ynn6Ot8=}PTDUmx6c`|XfI*?ce* zg46v2uw&OQ*uG;2*jiS@s#TXsYa2i;2_VV?!H0U=B?e+(4i3-4w%w;;WF!a|IZmS3s}vkXd{|~urN>a{haCCIa5rL*2wY@z zmkdz3iQz&u`T&1w=QDqHHF+Y)4BYvhjQkc28w*qw%H4b4gwFGNAuI4@+e18)D(XrE z0rdAjesM1QR_0Np{9ayey#4f}mkz^^UpXSxuw!usV*V6l(!4auW0_t^aaM4e=moJR zAFQH4(|aM%ycsw;92-CS${Tp7%A!44w!IY(Cxi_1^4wMrC1=LLnzCY@UXMCeR<6Yn zc_9@bNJ1SPWgb-$5tG0qGca~00RGWP5ghy>RxrW~XRnd|F2smR)|4M3(6Kx?d{z(7 z3|udrWWrgAkhGHa&e4H$7-&t2#rM{GMzxHEELledCJoDyC*J(L%#I|0+xyM+%clW%zkn5GvK2e z(BdVt@rgs*@Z4n#)c3_?Gs{GR!BNU=epRQpeX@`NXEQ7;q!j=X6_4yyWsQ7I7Dc%X zG9@O?q6AY^qz+I5OyMsK_Ro&p3Yn}Cu3mAtOly=Th5zJ53Vwd#Gw|oB_vgJ>XzUH| z;C}3)Gr4&WOsNGJSfr9X!#+hBO*ar^J_yS43j?SOq#Qt@l%h-nl;H4;0O=SDT#A#* zBKaASMIBLsLx5uT=r19shhL&eADG<;x2)X>J?`-`)?kx5IJ*I!8N42Xj7vJl(a~&t zyzgg_|BV_~ac5QG&FDxlFrYISevjgVJMs)#T#Z)(35zXqqiU=Xvoc!}90(bq1iZ?u zDI6^eA8fG#vXReP{kSbNbCwc+N`i zr3sL1W*EstDjIn*!!mfc(NoRER|H9?147Ap#11yiAz(5n@Iv>^5ejXAnpsoOHw8*_ zo|3JDzS+7GU`um10_fOm$b00upW?ZynU@xW3PEFW(R?UKW*xk3-n_ z*gJ1-4-OsME@rb!-r7wBvLJAj3=UBR9Ad5rKM$O|fsz%#nfvUVK+iD|d(`CY;Eu6_ zzs2E9T#G%L0LdUpEW$Oi6VLzjaV8NPUXI_`>y0+47YAJwVnWrV=E|m(O^PT1N8P0G zajZKiAsw0Q`}Oy6Zj9$B&lMH~kiw(IlfhYEcyjowd?piH5;`)#dZQJkFxC>*iI=+bxeZESpuHISY6;TfcBmoiD5@?3j-S1Fz9>!`sdV&u1y4@zV$-{d}NE-Q2!7 z8yP{lT|z^v4015X0|BKhst61+Cq5m?($VSXCg1-3Q*6Q?k->?`k+N{(y+2&AXIa#P z%LPqBgH6gHvB=EWkay-M7Q6jVR)_Nry}|Ht3=~c=Bva5E6abx-%pixDQfhhyFsb4$ zL*<}Pkbn{Bn7}3jy8=V|eiIoxjQ4($GB|h<83fFt(|{#C*^NU0H0ZP};5c4#B5h(( z|AEPB{gu_}ya}1zCX}o;8c;%7m~bYR-@n3-0_b!Gjogir3TC1xln5~fMc`-<*c8gA z5}`~Y_CGZovupqraQg73O__ar_DD>U>Fi+BX&Ut>2$K9S zd!1_|VUAs$@DE)kW}+TkpT?zBj*fyshdda5te7N=d+9i+L&yLQ!EhBJivW>cg$!hQ zCdf1Kw^RO+H)c<~`d1OxQS#rLl(TXSOlB#pDbdcQ27GvB5kS&=1QK3m{Cpp#1&#pm zo)O+y!&@WRZuIuX&UPKpy~zAl*RT6zyTQ@iOptmP0?dj4GRpulD8@=7w!}m}<42kI zWF{3noAeF!M<4Nrno0q=%QSTD0EIXC0c%EWw6Ahn$tOBP_;|sg`nhaP;^Q@ zM=E-us#)j-ws4Bh%Uw`DXs}2fea``!4;Cq#q4KpFgOn^1mkP>40Qx@x1^@%5q|8xp RdhY-L002ovPDHLkV1ild?REeF literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_muzei.png b/app/src/main/res/mipmap-mdpi/ic_muzei.png new file mode 100644 index 0000000000000000000000000000000000000000..c22c48bd10d864e11232b369a4779fcb9be15db4 GIT binary patch literal 3542 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�+SLn=cdvK;>z za@6s@EDH+Y5+V{WT_%YvgGfD%oa?c$Yv7=J@a?ncI9>%ls)o^#a|wJ>JLgfp$gAE6 zWXzFx4z;s$TJzO@xlDLS_s9+NJ>! zU`EJ`2z=ycq)2=#GqT9J5cn=G>=~nd<0HP&-cb~)3TlKVsKC=|XVt&O`2hdiFTVEv zBOr|kLM?~rRq$~)tE3oJl1R1d)J|meSTbu$bvcn3s$En;W>qQY)Q-uJ7h>Zt7y>Gx zjVjPoTF1l~)U7@b8IT6PoCUm~c3$0zX5}1^5N$13qXAYyV$>0RRDK40qqtISl{+002ovPDHLkV1l|08>|2T literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_muzei.png b/app/src/main/res/mipmap-xxhdpi/ic_muzei.png new file mode 100644 index 0000000000000000000000000000000000000000..841826e10d0a306ae3b184ed0f743cbb2227ab07 GIT binary patch literal 12497 zcmV;?FfPxDP)I(!)KEeSF&7d@@(&j-ITFfUa^Vk2jubBBLK=jWOD+j_A<2c1BcYyYHej%^ z4K~IFcYAx&s&{EdGo#VH??|&dl4c~0q}`PrzkCMC(r9+(eZTX2%3Fp=r_*q{oGz6X z)#)lYT}}gZx|{~+bU6*s>2eyN)8%wgRy5TffFOvO_v>$apyd9^z%WpOfx_dc^V5^Z|4>Ck4* z9wvcLJ-hj{oA1xZ-#@X>vuXsrA4S`VbebDrD3Ya<37`@YNRlyNl8FUtT--E9n*p>& zt?WLJ-go=L0;H&wZtwUH_H3U4h(pSiNV5Fqk7N~5t!lNJ zv^QDJx|?h!UCLm#Z$aA=P3=8TC89xJH00)$DGjwr=&H49UU>)=adP-T<(3qM@TWui|%(JV1-AZr)5SS!9OpcB2*fIkzB4zLaKzOVddY;wLb#(Bvv%n)l7NPn}cR z5~5R#CK!I3^v1L{v+nvPo8fw!Nk8UjTk;EgOV@uQh$0c6Q?Yq7SPh^zYfru?tX$`r ziA@)`+ghVESja&=ub+U+&S+^?tBAXimffCCIvcp;bjJCugR-h|xGaG3VG74+e$#2y zOIqxP2b=7Md+kk~58E8=KZ*pVJrVzONstHv`8y2;(CF0*a_#d15R>pDKUBUV2sOHM zh+Kyc#XDeaY=efDZpS&xj(%B9u>YKuJGp4sCj2ur6v~a+UEzLn7c&OpwE?KvmKC=snO{4 zw{vOYJ9h4HLn<;p8x7T2X*c_7<0o=y@B~Tlg((YCq?hsnB7@Ts3zthxR3_uhi&_@A|^@&kv6T8no<4-NKW} zQPDL$9*013Ban`a1{%DfnW0#P z?k0-^nmU&`Pz61NoXpQ4CzGJ)RLvXbWB^F4NZ7RbBh<>S7Rx4kW7{7(`WD|6a1Hxo zA%9(5`i;mPG)KqWvCj@pg?V^zNv3qj{u6Z#5XtK2^!T_g zCPE}6EZUp3Cc}~T-jyF|ThfPaJoR4zKx9B({Rkq2nzhD2szvc{UW6P-tP>PNskFe1BwOFmt(Aan#o8opII(&GI#}_JkoUuqpT>~^0>8$xN z4OTt0^*4jwqLchSn4n?A7hjoDX?M0Q?Z2_9bIGX(5QiM-TsbDd?r?y`X1gaGjy#Lt zX-JS{$>SXI_0=^%wLCxEi{8*_gXSIwatVt!Pm<*@M3xxM{kgHD`(N9auHX}krwl-> zsP79q%Z*J<8l%bdU(+tv_m7=8L9nUvLi4@uRdwq~#~C9W4=%0Av9tyawDvWDrMY~+ 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 bPk;dc0gj{xkJbyu00000NkvXXu0mjfzQ74} literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_muzei.png b/app/src/main/res/mipmap-xxxhdpi/ic_muzei.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc9b30cd7acef889d1d685648b30c8e84884179 GIT binary patch literal 17018 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-sw600dp/bools.xml b/app/src/main/res/values-sw600dp/bools.xml new file mode 100644 index 0000000..a2b6639 --- /dev/null +++ b/app/src/main/res/values-sw600dp/bools.xml @@ -0,0 +1,4 @@ + + + false + \ No newline at end of file diff --git a/app/src/main/res/values-v11/bools.xml b/app/src/main/res/values-v11/bools.xml new file mode 100644 index 0000000..d187294 --- /dev/null +++ b/app/src/main/res/values-v11/bools.xml @@ -0,0 +1,4 @@ + + + true + \ No newline at end of file diff --git a/app/src/main/res/values-v14/dimens.xml b/app/src/main/res/values-v14/dimens.xml new file mode 100644 index 0000000..378aaaf --- /dev/null +++ b/app/src/main/res/values-v14/dimens.xml @@ -0,0 +1,4 @@ + + + 0dp + \ No newline at end of file diff --git a/app/src/main/res/values/bools.xml b/app/src/main/res/values/bools.xml new file mode 100644 index 0000000..11c11a9 --- /dev/null +++ b/app/src/main/res/values/bools.xml @@ -0,0 +1,5 @@ + + + false + true + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index cb5ab24..c0b2120 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -37,4 +37,20 @@ 6dp 360dp + + + 8dp + 8dp + 110dp + 40dp + 40dp + 40dp + 220dp + + 250dp + 180dp + 220dp + @dimen/widget_detail_default_height + 24dp + 38dp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f7bdb42..e110fd2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -163,5 +163,12 @@ Unknown (%1$s) DETAIL_ICON_TN + Sunshine Today + Sunshine Details + + Today\'s weather + + + Use my location diff --git a/app/src/main/res/xml/widget_info_detail.xml b/app/src/main/res/xml/widget_info_detail.xml new file mode 100644 index 0000000..583a5fb --- /dev/null +++ b/app/src/main/res/xml/widget_info_detail.xml @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/app/src/main/res/xml/widget_info_today.xml b/app/src/main/res/xml/widget_info_today.xml new file mode 100644 index 0000000..01cf70d --- /dev/null +++ b/app/src/main/res/xml/widget_info_today.xml @@ -0,0 +1,12 @@ + + \ No newline at end of file