theme improvements

This commit is contained in:
Mariotaku Lee 2016-03-14 16:17:46 +08:00
parent 3fc43ebe9c
commit 09b1fbb34a
96 changed files with 549 additions and 2107 deletions

Binary file not shown.

View File

@ -87,6 +87,7 @@ dependencies {
compile 'com.android.support:recyclerview-v7:23.2.1'
compile 'com.android.support:preference-v7:23.2.1'
compile 'com.android.support:preference-v14:23.2.1'
compile('com.github.afollestad:app-theme-engine:1.0.1@aar') { transitive = true }
compile 'com.twitter:twitter-text:1.13.0'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
compile 'com.squareup:otto:1.3.8'
@ -106,7 +107,6 @@ dependencies {
compile 'org.apache.commons:commons-lang3:3.4'
compile 'commons-primitives:commons-primitives:1.0'
compile 'com.bluelinelabs:logansquare:1.3.7'
compile 'org.jraf:android-switch-backport:2.0.1'
compile 'com.makeramen:roundedimageview:2.1.1'
compile 'com.soundcloud.android:android-crop:1.0.1@aar'
compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.2'

View File

@ -43,6 +43,6 @@
private android.graphics.drawable.Drawable mWindowContentOverlay;
}
-keepclassmembers class org.mariotaku.twidere.activity.support.BrowserSignInActivity.InjectorJavaScriptInterface {
-keepclassmembers class org.mariotaku.twidere.activity.BrowserSignInActivity.InjectorJavaScriptInterface {
public *;
}

View File

@ -1,8 +1,9 @@
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.net.Uri;
import org.junit.Test;
import org.mariotaku.twidere.activity.MediaViewerActivity;
import static org.junit.Assert.assertEquals;

View File

@ -33,7 +33,7 @@ import com.squareup.leakcanary.RefWatcher;
import com.squareup.leakcanary.ServiceHeapDumpListener;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.activity.support.ComposeActivity;
import org.mariotaku.twidere.activity.ComposeActivity;
import org.mariotaku.twidere.util.net.NoIntercept;
import java.io.IOException;

View File

@ -139,7 +139,7 @@
</intent-filter>
</activity>
<activity
android:name=".activity.support.HomeActivity"
android:name=".activity.HomeActivity"
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@style/Theme.Twidere.NoActionBar"
@ -163,11 +163,11 @@
android:value=".activity.support.HomeActivity"/>
</activity>
<activity
android:name=".activity.support.ComposeActivity"
android:name=".activity.ComposeActivity"
android:excludeFromRecents="true"
android:label="@string/compose"
android:launchMode="singleTop"
android:parentActivityName=".activity.support.HomeActivity"
android:parentActivityName=".activity.HomeActivity"
android:theme="@style/Theme.Twidere.Compose"
android:windowSoftInputMode="adjustResize">
<intent-filter android:label="@string/compose">
@ -193,10 +193,10 @@
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity"/>
android:value=".activity.HomeActivity"/>
</activity>
<activity
android:name=".activity.support.QuickSearchBarActivity"
android:name=".activity.QuickSearchBarActivity"
android:label="@string/search"
android:launchMode="singleTop"
android:theme="@style/Theme.Twidere.QuickSearchBar"
@ -208,7 +208,7 @@
</intent-filter>
</activity>
<activity
android:name=".activity.support.SignInActivity"
android:name=".activity.SignInActivity"
android:label="@string/sign_in"
android:theme="@style/Theme.Twidere.DialogWhenLarge.NoActionBar"
android:windowSoftInputMode="adjustResize">
@ -219,7 +219,7 @@
</intent-filter>
</activity>
<activity
android:name=".activity.support.BrowserSignInActivity"
android:name=".activity.BrowserSignInActivity"
android:label="@string/browser_sign_in"
android:theme="@style/Theme.Twidere"
android:windowSoftInputMode="adjustResize">
@ -232,7 +232,7 @@
<activity
android:name=".activity.SettingsActivity"
android:label="@string/settings"
android:parentActivityName=".activity.support.HomeActivity"
android:parentActivityName=".activity.HomeActivity"
android:theme="@style/Theme.Twidere"
android:windowSoftInputMode="adjustResize">
<intent-filter>
@ -244,15 +244,15 @@
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity"/>
android:value=".activity.HomeActivity"/>
</activity>
<activity
android:name=".activity.support.APIEditorActivity"
android:name=".activity.APIEditorActivity"
android:label="@string/edit_api"
android:theme="@style/Theme.Twidere.Dialog"
android:windowSoftInputMode="adjustResize"/>
<activity
android:name=".activity.support.AccountSelectorActivity"
android:name=".activity.AccountSelectorActivity"
android:label="@string/select_account"
android:theme="@style/Theme.Twidere.Dialog">
<intent-filter>
@ -262,17 +262,17 @@
</intent-filter>
</activity>
<activity
android:name=".activity.support.ColorPickerDialogActivity"
android:name=".activity.ColorPickerDialogActivity"
android:label="@string/set_color"
android:theme="@style/Theme.Twidere.NoDisplay"/>
<activity
android:name=".activity.support.LinkHandlerActivity"
android:parentActivityName=".activity.support.HomeActivity"
android:theme="@style/Theme.Twidere.DialogWhenLarge.NoActionBar"
android:name=".activity.LinkHandlerActivity"
android:parentActivityName=".activity.HomeActivity"
android:theme="@style/Theme.Twidere"
android:windowSoftInputMode="adjustResize">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity"/>
android:value=".activity.HomeActivity"/>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
@ -284,7 +284,7 @@
</intent-filter>
</activity>
<activity
android:name=".activity.support.MediaViewerActivity"
android:name=".activity.MediaViewerActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/media"
android:theme="@style/Theme.Twidere.Viewer"
@ -292,7 +292,7 @@
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity"/>
android:value=".activity.HomeActivity"/>
<intent-filter>
<action android:name="org.mariotaku.twidere.VIEW_MEDIA"/>
@ -306,7 +306,7 @@
</intent-filter>
</activity>
<activity
android:name=".activity.support.FileSelectorActivity"
android:name=".activity.FileSelectorActivity"
android:exported="false"
android:label="@string/pick_file"
android:theme="@style/Theme.Twidere.NoDisplay"
@ -319,7 +319,7 @@
</intent-filter>
</activity>
<activity
android:name=".activity.support.ThemedImagePickerActivity"
android:name=".activity.ThemedImagePickerActivity"
android:exported="false"
android:theme="@style/Theme.Twidere.NoDisplay"
android:windowSoftInputMode="adjustResize">
@ -332,7 +332,7 @@
</intent-filter>
</activity>
<activity
android:name=".activity.support.CustomTabEditorActivity"
android:name=".activity.CustomTabEditorActivity"
android:exported="false"
android:label="@string/add_tab"
android:theme="@style/Theme.Twidere.Dialog"
@ -359,7 +359,7 @@
android:label="@string/copy_link"
android:theme="@style/Theme.Twidere.NoDisplay"/>
<activity
android:name=".activity.support.RequestPermissionsActivity"
android:name=".activity.RequestPermissionsActivity"
android:label="@string/permissions_request"
android:theme="@style/Theme.Twidere.Dialog">
<intent-filter>
@ -369,7 +369,7 @@
</intent-filter>
</activity>
<activity
android:name=".activity.support.UserListSelectorActivity"
android:name=".activity.UserListSelectorActivity"
android:label="@string/select_user_list"
android:theme="@style/Theme.Twidere.Dialog">
<intent-filter>
@ -384,15 +384,15 @@
android:label="@string/settings_wizard"
android:theme="@style/Theme.Twidere"/>
<activity
android:name=".activity.support.DataExportActivity"
android:name=".activity.DataExportActivity"
android:label="@string/export_settings"
android:theme="@style/Theme.Twidere.NoDisplay"/>
<activity
android:name=".activity.support.DataImportActivity"
android:name=".activity.DataImportActivity"
android:label="@string/import_settings"
android:theme="@style/Theme.Twidere.NoDisplay"/>
<activity
android:name=".activity.support.ActivityPickerActivity"
android:name=".activity.ActivityPickerActivity"
android:theme="@style/Theme.Twidere.Dialog">
<intent-filter>
<action android:name="org.mariotaku.twidere.PICK_ACTIVITY"/>

View File

@ -1,98 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package android.support.v7.app;
import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.view.LayoutInflaterCompat;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Window;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory;
/**
* Created by mariotaku on 15/4/22.
*/
public class ThemedAppCompatDelegateFactory implements Constants {
/**
* Create a {@link android.support.v7.app.AppCompatDelegate} to use with {@code activity}.
*
* @param callback An optional callback for AppCompat specific events
*/
public static ThemedAppCompatDelegate create(@NonNull final IThemedActivity themed,
@NonNull final AppCompatCallback callback) {
final Activity activity = (Activity) themed;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
return new ThemedAppCompatDelegate(themed, activity, activity.getWindow(), callback);
} else {
throw new UnsupportedOperationException();
}
}
public static final class ThemedAppCompatDelegate extends AppCompatDelegateImplV14 {
private final IThemedActivity themed;
private KeyListener keyListener;
private ThemedAppCompatDelegate(@NonNull final IThemedActivity themed, @NonNull final Context context,
@NonNull final Window window, @NonNull final AppCompatCallback callback) {
super(context, window, callback);
this.themed = themed;
}
@Override
public void installViewFactory() {
final LayoutInflater inflater = LayoutInflater.from(mContext);
if (inflater.getFactory() == null) {
LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory(themed, this));
}
}
@Override
boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyListener != null && keyListener.onKeyDown(keyCode, event)) return true;
return super.onKeyDown(keyCode, event);
}
@Override
boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyListener != null && keyListener.onKeyUp(keyCode, event)) return true;
return super.onKeyUp(keyCode, event);
}
public void setKeyListener(KeyListener listener) {
keyListener = listener;
}
}
public interface KeyListener {
boolean onKeyDown(int keyCode, KeyEvent event);
boolean onKeyUp(int keyCode, KeyEvent event);
}
}

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.app.Dialog;
import android.content.Context;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.CursorLoader;

View File

@ -1,4 +1,4 @@
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.content.Intent;
import android.content.pm.ResolveInfo;

View File

@ -5,7 +5,6 @@ import android.content.Intent;
import android.os.Bundle;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.support.ComposeActivity;
import org.mariotaku.twidere.util.SharedPreferencesWrapper;
public class AssistLauncherActivity extends Activity implements Constants {

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.annotation.SuppressLint;
import android.graphics.Rect;
@ -29,6 +29,7 @@ import android.view.MotionEvent;
import com.squareup.otto.Bus;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.ThemedAppCompatActivity;
import org.mariotaku.twidere.activity.iface.IControlBarActivity;
import org.mariotaku.twidere.activity.iface.IExtendedActivity;
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback;

View File

@ -1,171 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.support.annotation.NonNull;
import android.view.KeyEvent;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.ActivityTracker;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle;
import javax.inject.Inject;
public abstract class BasePreferenceActivity extends PreferenceActivity implements Constants,
IThemedActivity, KeyboardShortcutsHandler.KeyboardShortcutCallback {
// Data fields
private int mCurrentThemeColor;
private int mCurrentThemeBackgroundAlpha;
@ShapeStyle
private int mProfileImageStyle;
private String mCurrentThemeBackgroundOption;
@Inject
protected KeyboardShortcutsHandler mKeyboardShortcutsHandler;
private String mCurrentThemeFontFamily;
@Inject
protected ActivityTracker mActivityTracker;
private int mMetaState;
@Override
public String getCurrentThemeFontFamily() {
return mCurrentThemeFontFamily;
}
@Override
public int getCurrentThemeBackgroundAlpha() {
return mCurrentThemeBackgroundAlpha;
}
@Override
public String getCurrentThemeBackgroundOption() {
return mCurrentThemeBackgroundOption;
}
@Override
public int getCurrentThemeColor() {
return mCurrentThemeColor;
}
@Override
public int getThemeBackgroundAlpha() {
return ThemeUtils.getUserThemeBackgroundAlpha(this);
}
@Override
public String getThemeBackgroundOption() {
return ThemeUtils.getThemeBackgroundOption(this);
}
@Override
public String getThemeFontFamily() {
return ThemeUtils.getThemeFontFamily(this);
}
@Override
@ShapeStyle
public int getCurrentProfileImageStyle() {
return mProfileImageStyle;
}
@Override
public final void restart() {
Utils.restartActivity(this);
}
@Override
public boolean handleKeyboardShortcutSingle(@NonNull KeyboardShortcutsHandler handler, int keyCode, @NonNull KeyEvent event, int metaState) {
return false;
}
@Override
public boolean handleKeyboardShortcutRepeat(@NonNull KeyboardShortcutsHandler handler, int keyCode, int repeatCount, @NonNull KeyEvent event, int metaState) {
return false;
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
if (BuildConfig.DEBUG) {
StrictModeUtils.detectAllVmPolicy();
StrictModeUtils.detectAllThreadPolicy();
}
super.onCreate(savedInstanceState);
GeneralComponentHelper.build(this).inject(this);
}
@Override
public boolean onKeyUp(int keyCode, @NonNull KeyEvent event) {
if (KeyEvent.isModifierKey(keyCode)) {
mMetaState &= ~KeyboardShortcutsHandler.getMetaStateForKeyCode(keyCode);
}
if (handleKeyboardShortcutSingle(mKeyboardShortcutsHandler, keyCode, event, mMetaState))
return true;
return super.onKeyUp(keyCode, event);
}
@Override
public boolean onKeyDown(int keyCode, @NonNull KeyEvent event) {
if (KeyEvent.isModifierKey(keyCode)) {
mMetaState |= KeyboardShortcutsHandler.getMetaStateForKeyCode(keyCode);
}
if (handleKeyboardShortcutRepeat(mKeyboardShortcutsHandler, keyCode, event.getRepeatCount(), event, mMetaState))
return true;
return super.onKeyDown(keyCode, event);
}
@Override
protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resId, boolean first) {
mCurrentThemeColor = getThemeColor();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
mProfileImageStyle = Utils.getProfileImageStyle(this);
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
mCurrentThemeFontFamily = getThemeFontFamily();
super.onApplyThemeResource(theme, resId, first);
if (shouldApplyWindowBackground()) {
ThemeUtils.applyWindowBackground(this, getWindow(),
mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha);
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
ThemeUtils.fixNightMode(getResources(), newConfig);
super.onConfigurationChanged(newConfig);
}
protected boolean shouldApplyWindowBackground() {
return true;
}
}

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.annotation.SuppressLint;
import android.content.res.Configuration;
@ -33,6 +33,7 @@ import android.view.View;
import android.view.ViewGroup;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.ThemedFragmentActivity;
import org.mariotaku.twidere.util.ThemeUtils;
@SuppressLint("Registered")

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.annotation.SuppressLint;
import android.app.Activity;

View File

@ -17,12 +17,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import org.mariotaku.twidere.activity.BaseSupportDialogActivity;
import org.mariotaku.twidere.fragment.support.ColorPickerDialogFragment;
import org.mariotaku.twidere.fragment.support.ColorPickerDialogFragment.Callback;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.Manifest;
import android.app.Activity;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.app.AlertDialog;
import android.app.Dialog;

View File

@ -1,4 +1,4 @@
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.content.Intent;
import android.os.AsyncTask;

View File

@ -1,4 +1,4 @@
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.content.Intent;
import android.os.AsyncTask;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.Manifest;
import android.content.Intent;
@ -31,6 +31,7 @@ import android.support.v4.app.DialogFragment;
import android.widget.Toast;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.BaseSupportDialogActivity;
import org.mariotaku.twidere.fragment.support.FileSelectorDialogFragment;
import org.mariotaku.twidere.util.PermissionUtils;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.app.PendingIntent;
import android.app.SearchManager;
@ -27,24 +27,22 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.database.ContentObserver;
import android.graphics.Color;
import android.graphics.PorterDuff.Mode;
import android.graphics.Rect;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceActivity;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.NotificationCompat;
import android.support.v4.view.GravityCompat;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.DrawerLayoutAccessor;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.util.SparseIntArray;
import android.view.Gravity;
@ -56,16 +54,12 @@ import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
import com.squareup.otto.Subscribe;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.SettingsActivity;
import org.mariotaku.twidere.activity.SettingsWizardActivity;
import org.mariotaku.twidere.activity.UsageStatisticsActivity;
import org.mariotaku.twidere.adapter.SupportTabsAdapter;
import org.mariotaku.twidere.annotation.CustomTabType;
import org.mariotaku.twidere.annotation.ReadPositionTag;
@ -99,14 +93,9 @@ import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TwidereColorUtils;
import org.mariotaku.twidere.util.TwidereMathUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.support.ActivitySupport;
import org.mariotaku.twidere.util.support.ActivitySupport.TaskDescriptionCompat;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat;
import org.mariotaku.twidere.view.ExtendedFrameLayout;
import org.mariotaku.twidere.view.ExtendedViewPager;
import org.mariotaku.twidere.view.TabPagerIndicator;
import org.mariotaku.twidere.view.TintedStatusFrameLayout;
import org.mariotaku.twidere.view.iface.IHomeActionButton;
import java.util.Collections;
import java.util.List;
@ -125,16 +114,15 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
private SupportTabsAdapter mPagerAdapter;
private ExtendedViewPager mViewPager;
private Toolbar mActionBar;
private TabPagerIndicator mTabIndicator;
private DrawerLayout mDrawerLayout;
private View mEmptyTabHint;
private View mActionsButton;
private View mActionBarWithOverlay;
private TintedStatusFrameLayout mHomeContent;
private FloatingActionButton mActionsButton;
private ExtendedFrameLayout mHomeContent;
private UpdateUnreadCountTask mUpdateUnreadCountTask;
private Toolbar mActionBar;
private OnSharedPreferenceChangeListener mReadStateChangeListener = new OnSharedPreferenceChangeListener() {
@Override
@ -144,7 +132,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
};
private ControlBarShowHideHelper mControlBarShowHideHelper = new ControlBarShowHideHelper(this);
private int mTabColumns;
private View mActionBarContainer;
public void closeAccountsDrawer() {
if (mDrawerLayout == null) return;
@ -185,8 +172,14 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
@Override
public boolean getSystemWindowsInsets(Rect insets) {
final int height = mTabIndicator != null ? mTabIndicator.getHeight() : 0;
insets.top = (height != 0 ? height : ThemeUtils.getActionBarHeight(this));
if (mTabIndicator == null || mHomeContent == null) return false;
final int height = mTabIndicator.getHeight();
if (height != 0) {
insets.top = height;
} else {
insets.top = ThemeUtils.getActionBarHeight(this);
}
insets.top += mHomeContent.getTop();
return true;
}
@ -327,14 +320,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
*/
@Override
protected void onCreate(final Bundle savedInstanceState) {
final Window window = getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
}
}
super.onCreate(savedInstanceState);
mMultiSelectHandler = new MultiSelectEventHandler(this);
mMultiSelectHandler.dispatchOnCreate();
@ -353,7 +338,9 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
return;
}
setContentView(R.layout.activity_home);
setSupportActionBar(mActionBar);
final boolean refreshOnStart = mPreferences.getBoolean(KEY_REFRESH_ON_START, false);
int tabDisplayOptionInt = Utils.getTabDisplayOptionInt(this);
@ -362,7 +349,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
mHomeContent.setOnFitSystemWindowsListener(this);
mPagerAdapter = new SupportTabsAdapter(this, getSupportFragmentManager(), mTabIndicator, mTabColumns);
mViewPager.setAdapter(mPagerAdapter);
// mViewPager.setOffscreenPageLimit(3);
mTabIndicator.setViewPager(mViewPager);
mTabIndicator.setOnPageChangeListener(this);
mTabIndicator.setColumns(mTabColumns);
@ -374,16 +360,22 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
mTabIndicator.setDisplayBadge(mPreferences.getBoolean(KEY_UNREAD_COUNT, true));
mTabIndicator.updateAppearance();
mHomeContent.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
if (top != oldTop) {
final Fragment fragment = getLeftDrawerFragment();
if (fragment instanceof AccountsDashboardFragment) {
((AccountsDashboardFragment) fragment).requestFitSystemWindows();
}
}
}
});
mActionsButton.setOnClickListener(this);
mActionsButton.setOnLongClickListener(this);
mEmptyTabHint.setOnClickListener(this);
ThemeUtils.setCompatContentViewOverlay(this, new EmptyDrawable());
ViewCompat.setElevation(mActionBarContainer, ThemeUtils.getSupportActionBarElevation(this));
ViewSupport.setOutlineProvider(mActionBarContainer, ViewOutlineProviderCompat.BACKGROUND);
final View windowOverlay = findViewById(R.id.window_overlay);
ViewSupport.setBackground(windowOverlay, ThemeUtils.getNormalWindowContentOverlay(this));
setupSlidingMenu();
setupBars();
showDataProfilingRequest();
@ -424,11 +416,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
@Override
protected void onResume() {
super.onResume();
if (ThemeUtils.isDarkTheme(this)) {
// TODO show dark bar
} else {
ActivitySupport.setTaskDescription(this, new TaskDescriptionCompat(null, null, getThemeColor()));
}
invalidateOptionsMenu();
updateActionsButtonStyle();
updateActionsButton();
@ -533,7 +520,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
if (fragment instanceof AccountsDashboardFragment) {
((AccountsDashboardFragment) fragment).requestFitSystemWindows();
}
mHomeContent.setStatusBarHeight(insets.top);
}
public void updateUnreadCount() {
@ -588,12 +574,14 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
return 1 - mActionsButton.getTranslationY() / total;
}
final float totalHeight = getControlBarHeight();
return 1 + mActionBarWithOverlay.getTranslationY() / totalHeight;
return 1 + mActionBar.getTranslationY() / totalHeight;
}
@Override
public void setControlBarOffset(float offset) {
mActionBarWithOverlay.setTranslationY(mTabColumns > 1 ? 0 : getControlBarHeight() * (offset - 1));
final ActionBar actionBar = getSupportActionBar();
if (actionBar == null) return;
mActionBar.setTranslationY(mTabColumns > 1 ? 0 : (int) (getControlBarHeight() * (offset - 1)));
final ViewGroup.LayoutParams lp = mActionsButton.getLayoutParams();
if (lp instanceof MarginLayoutParams) {
mActionsButton.setTranslationY((((MarginLayoutParams) lp).bottomMargin + mActionsButton.getHeight()) * (1 - offset));
@ -606,16 +594,13 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
@Override
public void onContentChanged() {
super.onContentChanged();
mActionBar = (Toolbar) findViewById(R.id.action_bar);
mActionBarContainer = findViewById(R.id.twidere_action_bar_container);
mTabIndicator = (TabPagerIndicator) findViewById(R.id.main_tabs);
mActionBar = (Toolbar) findViewById(R.id.action_bar);
mDrawerLayout = (DrawerLayout) findViewById(R.id.home_menu);
mViewPager = (ExtendedViewPager) findViewById(R.id.main_pager);
mEmptyTabHint = findViewById(R.id.empty_tab_hint);
mActionsButton = findViewById(R.id.actions_button);
mActionBarWithOverlay = findViewById(R.id.twidere_action_bar_with_overlay);
mTabIndicator = (TabPagerIndicator) findViewById(R.id.main_tabs);
mHomeContent = (TintedStatusFrameLayout) findViewById(R.id.home_content);
mActionsButton = (FloatingActionButton) findViewById(R.id.actions_button);
mHomeContent = (ExtendedFrameLayout) findViewById(R.id.home_content);
}
private Fragment getKeyboardShortcutRecipient() {
@ -747,34 +732,20 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
final String backgroundOption = getCurrentThemeBackgroundOption();
final boolean isTransparent = ThemeUtils.isTransparentBackground(backgroundOption);
final int actionBarAlpha = isTransparent ? ThemeUtils.getActionBarAlpha(ThemeUtils.getUserThemeBackgroundAlpha(this)) : 0xFF;
final IHomeActionButton homeActionButton = (IHomeActionButton) mActionsButton;
mTabIndicator.setItemContext(ThemeUtils.getActionBarThemedContext(this, themeColor));
ViewSupport.setBackground(mActionBarContainer, ThemeUtils.getActionBarBackground(this, themeColor,
backgroundOption, true));
final int actionBarColor = ThemeUtils.getActionBarColor(this, themeColor, backgroundOption);
final int actionItemColor = ThemeUtils.getContrastForegroundColor(this, themeColor);
final int[] foregroundColors = new int[2];
ThemeUtils.getColorForegroundAndInverse(this, foregroundColors);
if (ThemeUtils.isDarkTheme(this)) {
homeActionButton.setButtonColor(actionBarColor);
homeActionButton.setIconColor(actionItemColor, Mode.SRC_ATOP);
mTabIndicator.setStripColor(themeColor);
mTabIndicator.setIconColor(foregroundColors[0]);
mTabIndicator.setLabelColor(foregroundColors[0]);
} else {
final int contrastColor = TwidereColorUtils.getContrastYIQ(themeColor,
ThemeUtils.ACCENT_COLOR_THRESHOLD, foregroundColors[0], foregroundColors[1]);
homeActionButton.setButtonColor(themeColor);
homeActionButton.setIconColor(actionItemColor, Mode.SRC_ATOP);
mTabIndicator.setStripColor(contrastColor);
mTabIndicator.setIconColor(contrastColor);
mTabIndicator.setLabelColor(contrastColor);
}
mHomeContent.setDrawColor(true);
mHomeContent.setDrawShadow(false);
mHomeContent.setColor(actionBarColor, actionBarAlpha);
mHomeContent.setFactor(1);
mActionBarWithOverlay.setAlpha(actionBarAlpha / 255f);
mActionsButton.setAlpha(actionBarAlpha / 255f);
}
@ -843,11 +814,8 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
icon = R.drawable.ic_action_status_compose;
title = R.string.compose;
}
if (mActionsButton instanceof IHomeActionButton) {
final IHomeActionButton hab = (IHomeActionButton) mActionsButton;
hab.setIcon(icon);
hab.setTitle(title);
}
mActionsButton.setImageResource(icon);
mActionsButton.setContentDescription(getString(title));
}
private void updateActionsButtonStyle() {

View File

@ -138,11 +138,6 @@ public class ImageCropperActivity extends CropImageActivity implements IThemedAc
return mProfileImageStyle;
}
@Override
public final void restart() {
Utils.restartActivity(this);
}
@Override
protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resId, boolean first) {
mCurrentThemeColor = getThemeColor();

View File

@ -37,7 +37,8 @@ import org.mariotaku.twidere.util.ThemeUtils;
/**
* Created by mariotaku on 15/4/20.
*/
public class KeyboardShortcutPreferenceCompatActivity extends BaseThemedActivity implements Constants, OnClickListener {
public class KeyboardShortcutPreferenceCompatActivity extends BaseSupportDialogActivity implements
Constants, OnClickListener {
public static final String EXTRA_CONTEXT_TAG = "context_tag";
public static final String EXTRA_KEY_ACTION = "key_action";
@ -74,12 +75,12 @@ public class KeyboardShortcutPreferenceCompatActivity extends BaseThemedActivity
switch (v.getId()) {
case R.id.button_positive: {
if (mKeySpec == null) return;
mKeyboardShortcutHandler.register(mKeySpec, getKeyAction());
mKeyboardShortcutsHandler.register(mKeySpec, getKeyAction());
finish();
break;
}
case R.id.button_neutral: {
mKeyboardShortcutHandler.unregister(getKeyAction());
mKeyboardShortcutsHandler.unregister(getKeyAction());
finish();
break;
}
@ -112,10 +113,10 @@ public class KeyboardShortcutPreferenceCompatActivity extends BaseThemedActivity
}
mKeySpec = spec;
mKeysLabel.setText(spec.toKeyString());
final String oldAction = mKeyboardShortcutHandler.findAction(spec);
final String oldAction = mKeyboardShortcutsHandler.findAction(spec);
final KeyboardShortcutSpec copyOfSpec = spec.copy();
copyOfSpec.setContextTag(null);
final String oldGeneralAction = mKeyboardShortcutHandler.findAction(copyOfSpec);
final String oldGeneralAction = mKeyboardShortcutsHandler.findAction(copyOfSpec);
if (!TextUtils.isEmpty(oldAction) && !keyAction.equals(oldAction)) {
// Conflicts with keys in same context tag
mConflictLabel.setVisibility(View.VISIBLE);

View File

@ -17,30 +17,25 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.NavUtils;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.ActionBarContainer;
import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IControlBarActivity;
@ -53,14 +48,10 @@ import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
import org.mariotaku.twidere.util.MultiSelectEventHandler;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TwidereActionModeForChildListener;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.support.ActivitySupport;
import org.mariotaku.twidere.util.support.ActivitySupport.TaskDescriptionCompat;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat;
import org.mariotaku.twidere.view.TintedStatusFrameLayout;
import org.mariotaku.twidere.view.TintedStatusNativeActionModeAwareLayout;
import static org.mariotaku.twidere.util.Utils.createFragmentForIntent;
import static org.mariotaku.twidere.util.Utils.matchLinkId;
@ -70,8 +61,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
private ControlBarShowHideHelper mControlBarShowHideHelper = new ControlBarShowHideHelper(this);
private MultiSelectEventHandler mMultiSelectHandler;
private TwidereActionModeForChildListener mTwidereActionModeForChildListener;
private TintedStatusFrameLayout mMainContent;
private final View.OnLayoutChangeListener mLayoutChangeListener = new View.OnLayoutChangeListener() {
private final Rect tempInsets = new Rect();
@ -81,14 +70,11 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
if (compatCalled) return;
if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom && !ViewSupport.isInLayout(v)) {
mMainContent.getSystemWindowsInsets(tempInsets);
onFitSystemWindows(tempInsets);
compatCalled = true;
}
}
};
private View mActionBarWithOverlay;
private ActionBarContainer mActionBarContainer;
private boolean mFinishOnly;
private int mActionBarHeight;
@ -104,14 +90,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
return false;
}
@Override
public void onBackPressed() {
if (mTwidereActionModeForChildListener.finishExisting()) {
return;
}
super.onBackPressed();
}
@Override
public void onFitSystemWindows(Rect insets) {
final View actionBarContainer = findViewById(R.id.twidere_action_bar_container);
@ -206,28 +184,14 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
final Intent intent = getIntent();
final Uri data = intent.getData();
final int linkId = matchLinkId(data);
requestWindowFeatures(getWindow(), linkId, data);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content_fragment);
setSupportActionBar((Toolbar) findViewById(R.id.action_bar));
mTwidereActionModeForChildListener = new TwidereActionModeForChildListener(this, this, false);
final TintedStatusNativeActionModeAwareLayout layout = (TintedStatusNativeActionModeAwareLayout) findViewById(R.id.main_content);
layout.setActionModeForChildListener(mTwidereActionModeForChildListener);
ThemeUtils.setCompatContentViewOverlay(this, new EmptyDrawable());
final View actionBarContainer = findViewById(R.id.twidere_action_bar_container);
ViewCompat.setElevation(actionBarContainer, ThemeUtils.getSupportActionBarElevation(this));
ViewSupport.setOutlineProvider(actionBarContainer, ViewOutlineProviderCompat.BACKGROUND);
final View windowOverlay = findViewById(R.id.window_overlay);
ViewSupport.setBackground(windowOverlay, ThemeUtils.getNormalWindowContentOverlay(this));
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
setActionBarTheme(linkId);
}
mMainContent.setOnFitSystemWindowsListener(this);
setStatusBarColor(linkId, data);
Utils.logOpenNotificationFromUri(this, data);
if (!showFragment(linkId, data)) {
finish();
@ -237,7 +201,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
@Override
protected void onStart() {
mMainContent.addOnLayoutChangeListener(mLayoutChangeListener);
super.onStart();
mMultiSelectHandler.dispatchOnStart();
}
@ -246,22 +209,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
protected void onStop() {
mMultiSelectHandler.dispatchOnStop();
super.onStop();
mMainContent.removeOnLayoutChangeListener(mLayoutChangeListener);
}
@Override
public boolean onPreparePanel(int featureId, View view, Menu menu) {
final boolean result = super.onPreparePanel(featureId, view, menu);
if (shouldSetActionItemColor()) {
setupToolbarMenuItemColor();
mActionBarContainer.post(new Runnable() {
@Override
public void run() {
setupToolbarMenuItemColor();
}
});
}
return result;
}
private void setupToolbarMenuItemColor() {
@ -282,9 +229,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
@Override
public void onContentChanged() {
super.onContentChanged();
mMainContent = (TintedStatusFrameLayout) findViewById(R.id.main_content);
mActionBarWithOverlay = findViewById(R.id.twidere_action_bar_with_overlay);
mActionBarContainer = (ActionBarContainer) findViewById(R.id.twidere_action_bar_container);
}
protected boolean shouldSetActionItemColor() {
@ -313,24 +257,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
return false;
}
private void requestWindowFeatures(Window window, int linkId, Uri uri) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
window.addFlags(LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
final int transitionRes;
switch (linkId) {
default: {
transitionRes = 0;
break;
}
}
//noinspection ConstantConditions
if (transitionRes != 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
&& !ThemeUtils.isTransparentBackground(getCurrentThemeBackgroundOption())) {
Utils.setSharedElementTransition(this, window, transitionRes);
}
}
@SuppressLint("AppCompatMethod")
private void setActionBarTheme(int linkId) {
final int themeColor = getCurrentThemeColor();
@ -349,28 +275,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
break;
}
}
final boolean isTransparent = ThemeUtils.isTransparentBackground(option);
final int actionBarAlpha = isTransparent ? ThemeUtils.getActionBarAlpha(ThemeUtils.getUserThemeBackgroundAlpha(this)) : 0xFF;
mActionBarWithOverlay.setAlpha(actionBarAlpha / 255f);
}
private void setStatusBarColor(int linkId, Uri uri) {
switch (linkId) {
case LINK_ID_USER: {
mMainContent.setDrawShadow(true);
mMainContent.setShadowColor(0xA0000000);
break;
}
default: {
mMainContent.setDrawShadow(false);
break;
}
}
mMainContent.setDrawColor(true);
mMainContent.setFactor(1);
final int alpha = ThemeUtils.getActionBarAlpha(getThemeBackgroundOption(), getCurrentThemeBackgroundAlpha());
final int statusBarColor = ThemeUtils.getActionBarColor(this, getCurrentThemeColor(), getThemeBackgroundOption());
mMainContent.setColor(statusBarColor, alpha);
}
private boolean showFragment(final int linkId, final Uri uri) {
@ -528,7 +432,7 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
}
mFinishOnly = Boolean.parseBoolean(uri.getQueryParameter(QUERY_PARAM_FINISH_ONLY));
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_fragment, fragment);
ft.replace(android.R.id.content, fragment);
ft.commit();
return true;
}
@ -549,14 +453,12 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
@Override
public float getControlBarOffset() {
return 1 + mActionBarContainer.getTranslationY() / (float) getControlBarHeight();
return 0;
}
@Override
public void setControlBarOffset(float offset) {
final int translationY = -Math.round((1 - offset) * getControlBarHeight());
mActionBarContainer.setTranslationY(translationY);
mTwidereActionModeForChildListener.setModeTranslationY(translationY);
notifyControlBarOffsetChanged();
}
@ -576,7 +478,7 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
}
public ActionBarContainer getActionBarContainer() {
return mActionBarContainer;
return null;
}
public interface HideUiOnScroll {

View File

@ -26,7 +26,6 @@ import android.os.Bundle;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.ThemeUtils;

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.Manifest;
import android.annotation.SuppressLint;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.content.ContentResolver;
import android.content.Context;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@ -36,6 +36,7 @@ import android.widget.ImageView;
import android.widget.TextView;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.BaseSupportDialogActivity;
import org.mariotaku.twidere.util.HtmlEscapeHelper;
import org.mariotaku.twidere.util.PermissionsManager;

View File

@ -51,7 +51,6 @@ import android.widget.ListView;
import android.widget.TextView;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.fragment.CustomTabsFragment;
import org.mariotaku.twidere.fragment.ExtensionsListFragment;
import org.mariotaku.twidere.fragment.SettingsDetailsFragment;

View File

@ -35,12 +35,9 @@ import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.view.LayoutInflaterCompat;
import android.support.v4.view.LayoutInflaterFactory;
import android.support.v4.view.ViewPager;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@ -48,9 +45,6 @@ import android.view.ViewGroup;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.activity.support.DataImportActivity;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.adapter.SupportTabsAdapter;
import org.mariotaku.twidere.annotation.CustomTabType;
import org.mariotaku.twidere.fragment.BasePreferenceFragment;
@ -70,7 +64,6 @@ import org.mariotaku.twidere.util.CustomTabUtils;
import org.mariotaku.twidere.util.InternalParseUtils;
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory;
import org.mariotaku.twidere.util.TwidereMathUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.LinePageIndicator;
@ -174,21 +167,6 @@ public class SettingsWizardActivity extends BaseAppCompatActivity implements Con
return ThemeUtils.getUserAccentColor(this);
}
@NonNull
@Override
public LayoutInflater getLayoutInflater() {
final LayoutInflater inflater = super.getLayoutInflater();
if (inflater.getFactory() == null) {
LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory(this, new LayoutInflaterFactory() {
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
return SettingsWizardActivity.this.onCreateView(parent, name, context, attrs);
}
}));
}
return inflater;
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -314,7 +292,7 @@ public class SettingsWizardActivity extends BaseAppCompatActivity implements Con
final Intent intent = getIntent();
intent.putExtra(EXTRA_PAGE, mViewPager.getCurrentItem());
setIntent(intent);
restart();
recreate();
}
public static class WizardPageCardsFragment extends BaseWizardPageFragment {

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.app.Dialog;
import android.content.ContentResolver;
@ -41,7 +41,6 @@ import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar;
@ -69,7 +68,6 @@ import org.mariotaku.restfu.http.Endpoint;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.SettingsActivity;
import org.mariotaku.twidere.activity.iface.IExtendedActivity;
import org.mariotaku.twidere.api.statusnet.model.StatusNetConfig;
import org.mariotaku.twidere.api.twitter.Twitter;
@ -533,21 +531,6 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList
return true;
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
setupActionBar();
}
private void setupActionBar() {
final ActionBar actionBar = getSupportActionBar();
if (actionBar == null) return;
final int themeColor = getCurrentThemeColor();
final String option = getThemeBackgroundOption();
ThemeUtils.applyActionBarBackground(actionBar, this, themeColor, option, isActionBarOutlineEnabled());
}
private void setupTintStatusBar() {
if (mMainContent == null) return;

View File

@ -19,32 +19,39 @@
package org.mariotaku.twidere.activity;
import android.app.Activity;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Window;
import com.afollestad.appthemeengine.ATE;
import com.afollestad.appthemeengine.ATEActivity;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.iface.IAppCompatActivity;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
import org.mariotaku.twidere.view.ShapedImageView;
import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle;
import javax.inject.Inject;
public abstract class BaseThemedActivity extends Activity implements IThemedActivity {
public abstract class ThemedAppCompatActivity extends ATEActivity implements Constants,
IThemedActivity, IAppCompatActivity {
// Data fields
private int mCurrentThemeColor;
private int mCurrentThemeBackgroundAlpha;
private String mCurrentThemeFontFamily;
private String mCurrentThemeBackgroundOption;
@ShapeStyle
private int mProfileImageStyle;
@Inject
protected KeyboardShortcutsHandler mKeyboardShortcutHandler;
private String mCurrentThemeBackgroundOption;
private String mCurrentThemeFontFamily;
private Toolbar mToolbar;
@Override
public String getCurrentThemeFontFamily() {
@ -72,7 +79,9 @@ public abstract class BaseThemedActivity extends Activity implements IThemedActi
}
@Override
public abstract int getThemeColor();
public String getThemeBackgroundOption() {
return ThemeUtils.getThemeBackgroundOption(this);
}
@Override
public String getThemeFontFamily() {
@ -80,52 +89,42 @@ public abstract class BaseThemedActivity extends Activity implements IThemedActi
}
@Override
@ShapedImageView.ShapeStyle
@ShapeStyle
public int getCurrentProfileImageStyle() {
return mProfileImageStyle;
}
@Override
public final void restart() {
Utils.restartActivity(this);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
if (BuildConfig.DEBUG) {
StrictModeUtils.detectAllVmPolicy();
StrictModeUtils.detectAllThreadPolicy();
}
final int themeColor = getThemeColor();
super.onCreate(savedInstanceState);
GeneralComponentHelper.build(this).inject(this);
setActionBarBackground();
}
private void setActionBarBackground() {
}
@Nullable
@Override
public void setTheme(int resId) {
super.setTheme(resId);
if (shouldApplyWindowBackground()) {
ThemeUtils.applyWindowBackground(this, getWindow(),
mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha);
}
public String getATEKey() {
return ThemeUtils.getATEKey(this);
}
@Override
protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resId, boolean first) {
mCurrentThemeColor = getThemeColor();
mCurrentThemeFontFamily = getThemeFontFamily();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
mProfileImageStyle = Utils.getProfileImageStyle(this);
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
mCurrentThemeFontFamily = getThemeFontFamily();
super.onApplyThemeResource(theme, resId, first);
}
protected boolean shouldApplyWindowBackground() {
return true;
final Window window = getWindow();
if (shouldApplyWindowBackground()) {
ThemeUtils.applyWindowBackground(this, window, mCurrentThemeBackgroundOption,
mCurrentThemeBackgroundAlpha);
}
}
@ -134,4 +133,24 @@ public abstract class BaseThemedActivity extends Activity implements IThemedActi
ThemeUtils.fixNightMode(getResources(), newConfig);
super.onConfigurationChanged(newConfig);
}
@Nullable
public final Toolbar peekActionBarToolbar() {
return mToolbar;
}
@Nullable
public final Toolbar getActionBarToolbar() {
if (mToolbar != null) return mToolbar;
final View actionBarView = getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar);
if (actionBarView instanceof Toolbar) {
return (Toolbar) actionBarView;
}
return null;
}
protected boolean shouldApplyWindowBackground() {
return true;
}
}

View File

@ -17,20 +17,14 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.LayoutInflaterCompat;
import android.support.v4.view.LayoutInflaterFactory;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import com.squareup.otto.Bus;
@ -46,7 +40,6 @@ import org.mariotaku.twidere.util.PermissionsManager;
import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory;
import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
@ -84,21 +77,6 @@ public abstract class ThemedFragmentActivity extends FragmentActivity implements
private String mCurrentThemeFontFamily;
private int mMetaState;
@NonNull
@Override
public LayoutInflater getLayoutInflater() {
final LayoutInflater inflater = super.getLayoutInflater();
if (inflater.getFactory() == null) {
LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory(this, new LayoutInflaterFactory() {
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
return ThemedFragmentActivity.this.onCreateView(parent, name, context, attrs);
}
}));
}
return inflater;
}
@Override
public String getCurrentThemeFontFamily() {
return mCurrentThemeFontFamily;
@ -140,11 +118,6 @@ public abstract class ThemedFragmentActivity extends FragmentActivity implements
return mProfileImageStyle;
}
@Override
public final void restart() {
Utils.restartActivity(this);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
if (BuildConfig.DEBUG) {

View File

@ -1,4 +1,4 @@
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.content.Context;
import android.content.Intent;
@ -6,7 +6,6 @@ import android.net.Uri;
import android.support.annotation.NonNull;
import org.mariotaku.pickncrop.library.ImagePickerActivity;
import org.mariotaku.twidere.activity.ImageCropperActivity;
import org.mariotaku.twidere.util.RestFuNetworkStreamDownloader;
public class ThemedImagePickerActivity extends ImagePickerActivity {

View File

@ -15,7 +15,6 @@ import android.util.Pair;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.support.ComposeActivity;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.support.IntentSupport;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
package org.mariotaku.twidere.activity;
import android.content.Intent;
import android.os.AsyncTask;

View File

@ -42,6 +42,4 @@ public interface IThemedActivity {
@ShapedImageView.ShapeStyle
int getCurrentProfileImageStyle();
void restart();
}

View File

@ -1,197 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.ThemedAppCompatDelegateFactory;
import android.support.v7.widget.ActionBarContainer;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IAppCompatActivity;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle;
public abstract class ThemedAppCompatActivity extends AppCompatActivity implements Constants,
IThemedActivity, IAppCompatActivity {
// Data fields
private int mCurrentThemeColor;
private int mCurrentThemeBackgroundAlpha;
@ShapeStyle
private int mProfileImageStyle;
private String mCurrentThemeBackgroundOption;
private String mCurrentThemeFontFamily;
private ThemedAppCompatDelegateFactory.ThemedAppCompatDelegate mDelegate;
private Toolbar mToolbar;
@Override
public String getCurrentThemeFontFamily() {
return mCurrentThemeFontFamily;
}
@Override
public int getCurrentThemeBackgroundAlpha() {
return mCurrentThemeBackgroundAlpha;
}
@Override
public String getCurrentThemeBackgroundOption() {
return mCurrentThemeBackgroundOption;
}
@Override
public int getCurrentThemeColor() {
return mCurrentThemeColor;
}
@Override
public int getThemeBackgroundAlpha() {
return ThemeUtils.getUserThemeBackgroundAlpha(this);
}
@Override
public String getThemeBackgroundOption() {
return ThemeUtils.getThemeBackgroundOption(this);
}
@Override
public String getThemeFontFamily() {
return ThemeUtils.getThemeFontFamily(this);
}
@Override
@ShapeStyle
public int getCurrentProfileImageStyle() {
return mProfileImageStyle;
}
@Override
public final void restart() {
Utils.restartActivity(this);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
if (BuildConfig.DEBUG) {
StrictModeUtils.detectAllVmPolicy();
StrictModeUtils.detectAllThreadPolicy();
}
super.onCreate(savedInstanceState);
ThemeUtils.applyToolbarItemColor(this, getActionBarToolbar(), getCurrentThemeColor());
}
@Override
public void onSupportActionModeStarted(@NonNull android.support.v7.view.ActionMode mode) {
super.onSupportActionModeStarted(mode);
ThemeUtils.applySupportActionModeColor(mode, getCurrentThemeColor(),
getThemeBackgroundOption(), true);
ThemeUtils.applySupportActionModeItemColor(mode, getCurrentThemeColor());
}
@NonNull
@Override
public ThemedAppCompatDelegateFactory.ThemedAppCompatDelegate getDelegate() {
if (mDelegate != null) return mDelegate;
return mDelegate = ThemedAppCompatDelegateFactory.create(this, this);
}
@Override
protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resId, boolean first) {
mCurrentThemeColor = getThemeColor();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
mProfileImageStyle = Utils.getProfileImageStyle(this);
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
mCurrentThemeFontFamily = getThemeFontFamily();
super.onApplyThemeResource(theme, resId, first);
final Window window = getWindow();
if (shouldApplyWindowBackground()) {
ThemeUtils.applyWindowBackground(this, window, mCurrentThemeBackgroundOption,
mCurrentThemeBackgroundAlpha);
}
}
@Override
public void onContentChanged() {
super.onContentChanged();
final Window window = getWindow();
final Toolbar actionBarToolbar = (Toolbar) window.findViewById(R.id.action_bar);
final ActionBarContainer actionBarContainer = (ActionBarContainer) window.findViewById(R.id.action_bar_container);
ThemeUtils.applyActionBarBackground(actionBarContainer, this, mCurrentThemeColor,
mCurrentThemeBackgroundOption, true);
ThemeUtils.applyToolbarItemColor(this, actionBarToolbar, mCurrentThemeColor);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
final boolean result = super.onPrepareOptionsMenu(menu);
final Window window = getWindow();
final Toolbar actionBarToolbar = (Toolbar) window.findViewById(R.id.action_bar);
ThemeUtils.applyToolbarItemColor(this, actionBarToolbar, mCurrentThemeColor);
return result;
}
@Override
public void setSupportActionBar(Toolbar toolbar) {
super.setSupportActionBar(toolbar);
mToolbar = toolbar;
ThemeUtils.applyToolbarItemColor(this, toolbar, mCurrentThemeColor);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
ThemeUtils.fixNightMode(getResources(), newConfig);
super.onConfigurationChanged(newConfig);
}
@Nullable
public final Toolbar peekActionBarToolbar() {
return mToolbar;
}
@Nullable
public final Toolbar getActionBarToolbar() {
if (mToolbar != null) return mToolbar;
final View actionBarView = getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar);
if (actionBarView instanceof Toolbar) {
return (Toolbar) actionBarView;
}
return null;
}
protected boolean shouldApplyWindowBackground() {
return true;
}
}

View File

@ -36,11 +36,15 @@ import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.multidex.MultiDex;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatDelegate;
import com.afollestad.appthemeengine.ATE;
import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.AssistLauncherActivity;
import org.mariotaku.twidere.activity.MainActivity;
import org.mariotaku.twidere.activity.MainHondaJOJOActivity;
@ -114,6 +118,10 @@ public class TwidereApplication extends Application implements Constants,
if (BuildConfig.DEBUG) {
StrictModeUtils.detectAllVmPolicy();
}
if (!ATE.config(this, null).isConfigured()) {
final int accentColor = ThemeUtils.getUserAccentColor(this);
ATE.config(this, null).primaryColor(accentColor).accentColor(accentColor).commit();
}
resetTheme(getSharedPreferences());
super.onCreate();
initializeAsyncTask();
@ -255,6 +263,12 @@ public class TwidereApplication extends Application implements Constants,
resetTheme(preferences);
break;
}
case KEY_THEME_COLOR: {
final int themeColor = preferences.getInt(key, ContextCompat.getColor(this, R.color.branding_color));
ATE.config(this, "light").primaryColor(themeColor).accentColor(themeColor).commit();
ATE.config(this, "dark").accentColor(themeColor).commit();
break;
}
}
}

View File

@ -60,7 +60,7 @@ import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.sqliteqb.library.RawItemArray;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.SettingsActivity;
import org.mariotaku.twidere.activity.support.CustomTabEditorActivity;
import org.mariotaku.twidere.activity.CustomTabEditorActivity;
import org.mariotaku.twidere.fragment.support.BaseSupportFragment;
import org.mariotaku.twidere.model.CustomTabConfiguration;
import org.mariotaku.twidere.model.CustomTabConfiguration.CustomTabConfigurationComparator;

View File

@ -35,7 +35,6 @@ import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.PorterDuff.Mode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
@ -43,11 +42,11 @@ import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.NavigationView;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.view.SupportMenuInflater;
import android.support.v7.widget.ActionMenuView;
@ -66,23 +65,16 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.commonsware.cwac.merge.MergeAdapter;
import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.ComposeActivity;
import org.mariotaku.twidere.activity.HomeActivity;
import org.mariotaku.twidere.activity.QuickSearchBarActivity;
import org.mariotaku.twidere.activity.SettingsActivity;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.ComposeActivity;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.activity.support.QuickSearchBarActivity;
import org.mariotaku.twidere.adapter.ArrayAdapter;
import org.mariotaku.twidere.annotation.CustomTabType;
import org.mariotaku.twidere.menu.support.AccountToggleProvider;
import org.mariotaku.twidere.model.ParcelableAccount;
@ -96,36 +88,27 @@ import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.IntentUtils;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
import org.mariotaku.twidere.util.ListViewUtils;
import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.MenuUtils;
import org.mariotaku.twidere.util.TransitionUtils;
import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.content.SupportFragmentReloadCursorObserver;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
import org.mariotaku.twidere.view.ShapedImageView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
public class AccountsDashboardFragment extends BaseSupportFragment implements LoaderCallbacks<Cursor>,
OnSharedPreferenceChangeListener, OnClickListener, KeyboardShortcutCallback,
AdapterView.OnItemClickListener {
NavigationView.OnNavigationItemSelectedListener {
private final Rect mSystemWindowsInsets = new Rect();
private ContentResolver mResolver;
private MergeAdapter mAdapter;
private AccountSelectorAdapter mAccountsAdapter;
private AccountOptionsAdapter mAccountOptionsAdapter;
private AppMenuAdapter mAppMenuAdapter;
private ListView mListView;
private NavigationView mNavigationView;
private View mAccountSelectorView;
private RecyclerView mAccountsSelector;
private ImageView mAccountProfileBannerView;
@ -197,25 +180,24 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
return false;
}
}
final int firstVisiblePosition = ListViewUtils.getFirstFullyVisiblePosition(mListView);
final int selectedItem = mListView.getSelectedItemPosition();
final int count = mListView.getCount();
int resultPosition;
if (!mListView.isFocused() || selectedItem == ListView.INVALID_POSITION) {
resultPosition = firstVisiblePosition;
} else {
resultPosition = selectedItem + offset;
while (resultPosition >= 0 && resultPosition < count && !mAdapter.isEnabled(resultPosition)) {
resultPosition += offset;
}
}
final View focusedChild = mListView.getFocusedChild();
if (focusedChild == null) {
mListView.requestChildFocus(mListView.getChildAt(0), null);
}
if (resultPosition >= 0 && resultPosition < count) {
mListView.setSelection(resultPosition);
}
// final int selectedItem = mNavigationView.getSelectedItemPosition();
// final int count = mNavigationView.getCount();
// int resultPosition;
// if (!mNavigationView.isFocused() || selectedItem == ListView.INVALID_POSITION) {
// resultPosition = firstVisiblePosition;
// } else {
// resultPosition = selectedItem + offset;
// while (resultPosition >= 0 && resultPosition < count && !mAdapter.isEnabled(resultPosition)) {
// resultPosition += offset;
// }
// }
// final View focusedChild = mNavigationView.getFocusedChild();
// if (focusedChild == null) {
// mNavigationView.requestChildFocus(mNavigationView.getChildAt(0), null);
// }
// if (resultPosition >= 0 && resultPosition < count) {
// mNavigationView.setSelection(resultPosition);
// }
return true;
}
@ -225,8 +207,8 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
case REQUEST_SETTINGS: {
if (data == null) return;
final FragmentActivity activity = getActivity();
if (data.getBooleanExtra(EXTRA_CHANGED, false) && activity instanceof IThemedActivity) {
((IThemedActivity) activity).restart();
if (data.getBooleanExtra(EXTRA_CHANGED, false)) {
activity.recreate();
}
return;
}
@ -298,8 +280,6 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
}
mAccountsAdapter.setSelectedAccountKey(accountKey);
mAccountOptionsAdapter.setSelectedAccount(mAccountsAdapter.getSelectedAccount());
if (mAccountActionProvider != null) {
mAccountActionProvider.setExclusive(false);
mAccountActionProvider.setAccounts(accounts);
@ -313,87 +293,6 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
public void onLoaderReset(final Loader<Cursor> loader) {
}
@Override
public void onItemClick(final AdapterView<?> parent, final View v, final int position, final long id) {
final ListAdapter adapter = mAdapter.getAdapter(position);
final Object item = mAdapter.getItem(position);
if (adapter instanceof AccountOptionsAdapter) {
final ParcelableAccount account = mAccountsAdapter.getSelectedAccount();
if (account == null || !(item instanceof OptionItem)) return;
final OptionItem option = (OptionItem) item;
switch (option.id) {
case R.id.search: {
final Intent intent = new Intent(getActivity(), QuickSearchBarActivity.class);
intent.putExtra(EXTRA_ACCOUNT_KEY, account.account_key);
startActivity(intent);
closeAccountsDrawer();
break;
}
case R.id.compose: {
final Intent composeIntent = new Intent(INTENT_ACTION_COMPOSE);
composeIntent.setClass(getActivity(), ComposeActivity.class);
composeIntent.putExtra(EXTRA_ACCOUNT_KEY, account.account_key);
startActivity(composeIntent);
break;
}
case R.id.favorites: {
IntentUtils.openUserFavorites(getActivity(), account.account_key,
account.account_key.getId(), account.screen_name);
break;
}
case R.id.lists: {
IntentUtils.openUserLists(getActivity(), account.account_key,
account.account_key.getId(), account.screen_name);
break;
}
case R.id.groups: {
IntentUtils.openUserGroups(getActivity(), account.account_key,
account.account_key.getId(), account.screen_name);
break;
}
case R.id.public_timeline: {
IntentUtils.openPublicTimeline(getActivity(), account.account_key);
break;
}
case R.id.messages: {
IntentUtils.openDirectMessages(getActivity(), account.account_key);
break;
}
case R.id.interactions: {
IntentUtils.openInteractions(getActivity(), account.account_key);
break;
}
case R.id.edit: {
IntentUtils.openProfileEditor(getActivity(), account.account_key);
break;
}
}
} else if (adapter instanceof AppMenuAdapter) {
if (!(item instanceof OptionItem)) return;
final OptionItem option = (OptionItem) item;
switch (option.id) {
case R.id.accounts: {
IntentUtils.openAccountsManager(getActivity());
break;
}
case R.id.drafts: {
IntentUtils.openDrafts(getActivity());
break;
}
case R.id.filters: {
IntentUtils.openFilters(getActivity());
break;
}
case R.id.settings: {
final Intent intent = new Intent(getActivity(), SettingsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivityForResult(intent, REQUEST_SETTINGS);
break;
}
}
closeAccountsDrawer();
}
}
@Override
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) {
@ -410,9 +309,7 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
private void updateSystemWindowsInsets() {
if (mAccountProfileContainer == null) return;
final HomeActivity activity = (HomeActivity) getActivity();
final Rect insets = mSystemWindowsInsets;
if (!activity.getDefaultSystemWindowsInsets(insets)) return;
final int top = Utils.getInsetsTopWithoutActionBarHeight(getActivity(), insets.top);
mAccountProfileContainer.setPadding(0, top, 0, 0);
}
@ -424,28 +321,14 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
final View view = getView();
assert view != null;
final Context context = view.getContext();
mListView.setItemsCanFocus(true);
mAdapter = new MergeAdapter();
final LayoutInflater inflater = getLayoutInflater(savedInstanceState);
mAccountsAdapter = new AccountSelectorAdapter(inflater, this);
mAccountOptionsAdapter = new AccountOptionsAdapter(context);
mAppMenuAdapter = new AppMenuAdapter(context);
mAccountSelectorView = inflater.inflate(R.layout.header_drawer_account_selector, mListView, false);
mAccountsSelector = (RecyclerView) mAccountSelectorView.findViewById(R.id.other_accounts_list);
final LinearLayoutManager layoutManager = new FixedLinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
layoutManager.setStackFromEnd(true);
mAccountsSelector.setLayoutManager(layoutManager);
mAccountsSelector.setAdapter(mAccountsAdapter);
mAccountsSelector.setItemAnimator(null);
mAccountProfileContainer = mAccountSelectorView.findViewById(R.id.profile_container);
mNoAccountContainer = mAccountSelectorView.findViewById(R.id.no_account_container);
mAccountProfileImageView = (ShapedImageView) mAccountSelectorView.findViewById(R.id.profile_image);
mAccountProfileBannerView = (ImageView) mAccountSelectorView.findViewById(R.id.account_profile_banner);
mFloatingProfileImageSnapshotView = (ImageView) mAccountSelectorView.findViewById(R.id.floating_profile_image_snapshot);
mAccountProfileNameView = (TextView) mAccountSelectorView.findViewById(R.id.name);
mAccountProfileScreenNameView = (TextView) mAccountSelectorView.findViewById(R.id.screen_name);
mAccountsToggleMenu = (ActionMenuView) mAccountSelectorView.findViewById(R.id.account_dashboard_menu);
final SupportMenuInflater menuInflater = new SupportMenuInflater(context);
menuInflater.inflate(R.menu.action_dashboard_timeline_toggle, mAccountsToggleMenu.getMenu());
mAccountsToggleMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@ -479,13 +362,7 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
});
mAccountProfileContainer.setOnClickListener(this);
mAdapter.addView(mAccountSelectorView, true);
mAdapter.addAdapter(mAccountOptionsAdapter);
mAdapter.addView(inflater.inflate(R.layout.layout_divider_drawer, mListView, false), false);
mAdapter.addAdapter(mAppMenuAdapter);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(this);
mNavigationView.setNavigationItemSelectedListener(this);
mPreferences.registerOnSharedPreferenceChangeListener(this);
loadAccounts();
@ -510,7 +387,17 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
@Override
public void onBaseViewCreated(View view, Bundle savedInstanceState) {
super.onBaseViewCreated(view, savedInstanceState);
mListView = (ListView) view.findViewById(android.R.id.list);
mNavigationView = (NavigationView) view.findViewById(R.id.navigation_view);
mAccountSelectorView = mNavigationView.getHeaderView(0);
mAccountsSelector = (RecyclerView) mAccountSelectorView.findViewById(R.id.other_accounts_list);
mAccountProfileContainer = mAccountSelectorView.findViewById(R.id.profile_container);
mNoAccountContainer = mAccountSelectorView.findViewById(R.id.no_account_container);
mAccountProfileImageView = (ShapedImageView) mAccountSelectorView.findViewById(R.id.profile_image);
mAccountProfileBannerView = (ImageView) mAccountSelectorView.findViewById(R.id.account_profile_banner);
mFloatingProfileImageSnapshotView = (ImageView) mAccountSelectorView.findViewById(R.id.floating_profile_image_snapshot);
mAccountProfileNameView = (TextView) mAccountSelectorView.findViewById(R.id.name);
mAccountProfileScreenNameView = (TextView) mAccountSelectorView.findViewById(R.id.screen_name);
mAccountsToggleMenu = (ActionMenuView) mAccountSelectorView.findViewById(R.id.account_dashboard_menu);
}
@Override
@ -552,40 +439,35 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
}
}
}
mAccountOptionsAdapter.clear();
mAccountOptionsAdapter.add(new OptionItem(R.string.search,
R.drawable.ic_action_search, R.id.search));
if (!hasInteractionsTab) {
mAccountOptionsAdapter.add(new OptionItem(R.string.interactions,
R.drawable.ic_action_notification, R.id.interactions));
}
if (!hasDmTab) {
mAccountOptionsAdapter.add(new OptionItem(R.string.direct_messages,
R.drawable.ic_action_message, R.id.messages));
}
final Menu menu = mNavigationView.getMenu();
MenuUtils.setMenuItemAvailability(menu, R.id.interactions, !hasInteractionsTab);
MenuUtils.setMenuItemAvailability(menu, R.id.messages, !hasDmTab);
if (mUseStarsForLikes) {
mAccountOptionsAdapter.add(new OptionItem(R.string.favorites, R.drawable.ic_action_star,
R.id.favorites));
MenuUtils.setMenuItemTitle(menu, R.id.favorites, R.string.favorites);
MenuUtils.setMenuItemIcon(menu, R.id.favorites, R.drawable.ic_action_star);
} else {
mAccountOptionsAdapter.add(new OptionItem(R.string.likes, R.drawable.ic_action_heart,
R.id.favorites));
MenuUtils.setMenuItemTitle(menu, R.id.favorites, R.string.likes);
MenuUtils.setMenuItemIcon(menu, R.id.favorites, R.drawable.ic_action_heart);
}
boolean hasLists = false, hasGroups = false, hasPublicTimeline = false;
switch (ParcelableAccountUtils.getAccountType(account)) {
case ParcelableAccount.Type.TWITTER: {
mAccountOptionsAdapter.add(new OptionItem(R.string.lists, R.drawable.ic_action_list,
R.id.lists));
hasLists = true;
break;
}
case ParcelableAccount.Type.STATUSNET: {
mAccountOptionsAdapter.add(new OptionItem(R.string.groups, R.drawable.ic_action_list,
R.id.groups));
hasGroups = true;
break;
}
case ParcelableAccount.Type.FANFOU: {
mAccountOptionsAdapter.add(new OptionItem(R.string.public_timeline, R.drawable.ic_action_quote,
R.id.public_timeline));
hasPublicTimeline = true;
break;
}
}
MenuUtils.setMenuItemAvailability(menu, R.id.groups, hasGroups);
MenuUtils.setMenuItemAvailability(menu, R.id.lists, hasLists);
MenuUtils.setMenuItemAvailability(menu, R.id.public_timeline, hasPublicTimeline);
}
private boolean hasAccountInTab(SupportTabSpec tab, UserKey accountId, boolean isActivated) {
@ -693,7 +575,6 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
editor.putString(KEY_DEFAULT_ACCOUNT_KEY, account.account_key.toString());
editor.apply();
mAccountsAdapter.setSelectedAccountKey(account.account_key);
mAccountOptionsAdapter.setSelectedAccount(account);
updateAccountActions();
updateAccountOptionsSeparatorLabel(clickedDrawable);
snapshotView.setVisibility(View.INVISIBLE);
@ -743,37 +624,80 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
private void updateDefaultAccountState() {
}
public static final class AccountOptionsAdapter extends OptionItemsAdapter {
private final boolean mNameFirst;
private ParcelableAccount mSelectedAccount;
AccountOptionsAdapter(final Context context) {
super(context);
mNameFirst = mPreferences.getBoolean(KEY_NAME_FIRST);
}
public void setSelectedAccount(ParcelableAccount account) {
mSelectedAccount = account;
notifyDataSetChanged();
}
@Override
public boolean isEnabled(final int position) {
return mSelectedAccount != null;
}
@Override
protected String getTitle(int position, OptionItem option) {
final ParcelableAccount account = mSelectedAccount;
if (account != null && option.id == R.id.compose) {
final Context context = getContext();
final String displayName = UserColorNameManager.getDisplayName(account.name,
account.screen_name, mNameFirst);
return context.getString(R.string.tweet_from_name, displayName);
@Override
public boolean onNavigationItemSelected(MenuItem item) {
final ParcelableAccount account = mAccountsAdapter.getSelectedAccount();
if (account == null) return false;
switch (item.getItemId()) {
case R.id.search: {
final Intent intent = new Intent(getActivity(), QuickSearchBarActivity.class);
intent.putExtra(EXTRA_ACCOUNT_KEY, account.account_key);
startActivity(intent);
closeAccountsDrawer();
break;
}
case R.id.compose: {
final Intent composeIntent = new Intent(INTENT_ACTION_COMPOSE);
composeIntent.setClass(getActivity(), ComposeActivity.class);
composeIntent.putExtra(EXTRA_ACCOUNT_KEY, account.account_key);
startActivity(composeIntent);
break;
}
case R.id.favorites: {
IntentUtils.openUserFavorites(getActivity(), account.account_key,
account.account_key.getId(), account.screen_name);
break;
}
case R.id.lists: {
IntentUtils.openUserLists(getActivity(), account.account_key,
account.account_key.getId(), account.screen_name);
break;
}
case R.id.groups: {
IntentUtils.openUserGroups(getActivity(), account.account_key,
account.account_key.getId(), account.screen_name);
break;
}
case R.id.public_timeline: {
IntentUtils.openPublicTimeline(getActivity(), account.account_key);
break;
}
case R.id.messages: {
IntentUtils.openDirectMessages(getActivity(), account.account_key);
break;
}
case R.id.interactions: {
IntentUtils.openInteractions(getActivity(), account.account_key);
break;
}
case R.id.edit: {
IntentUtils.openProfileEditor(getActivity(), account.account_key);
break;
}
case R.id.accounts: {
IntentUtils.openAccountsManager(getActivity());
closeAccountsDrawer();
break;
}
case R.id.drafts: {
IntentUtils.openDrafts(getActivity());
closeAccountsDrawer();
break;
}
case R.id.filters: {
IntentUtils.openFilters(getActivity());
closeAccountsDrawer();
break;
}
case R.id.settings: {
final Intent intent = new Intent(getActivity(), SettingsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivityForResult(intent, REQUEST_SETTINGS);
closeAccountsDrawer();
break;
}
return super.getTitle(position, option);
}
return false;
}
static class AccountProfileImageViewHolder extends ViewHolder implements OnClickListener {
@ -922,17 +846,6 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
}
}
private static final class AppMenuAdapter extends OptionItemsAdapter {
public AppMenuAdapter(final Context context) {
super(context);
add(new OptionItem(R.string.accounts, R.drawable.ic_action_accounts, R.id.accounts));
add(new OptionItem(R.string.drafts, R.drawable.ic_action_draft, R.id.drafts));
add(new OptionItem(R.string.filters, R.drawable.ic_action_speaker_muted, R.id.filters));
add(new OptionItem(R.string.settings, R.drawable.ic_action_settings, R.id.settings));
}
}
public static class OptionItem {
@ -972,35 +885,4 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
}
public static abstract class OptionItemsAdapter extends ArrayAdapter<OptionItem> {
@Inject
UserColorNameManager mUserColorNameManager;
@Inject
SharedPreferencesWrapper mPreferences;
private final int mActionIconColor;
OptionItemsAdapter(final Context context) {
super(context, R.layout.list_item_dashboard_menu);
GeneralComponentHelper.build(context).inject(this);
mActionIconColor = ThemeUtils.getThemeForegroundColor(context);
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
final OptionItem option = getItem(position);
final TextView text1 = (TextView) view.findViewById(android.R.id.text1);
final ImageView icon = (ImageView) view.findViewById(android.R.id.icon);
text1.setText(getTitle(position, option));
icon.setImageDrawable(ResourcesCompat.getDrawable(icon.getResources(), option.icon, null));
icon.setColorFilter(mActionIconColor, Mode.SRC_ATOP);
return view;
}
protected String getTitle(int position, OptionItem option) {
return getContext().getString(option.name);
}
}
}

View File

@ -41,8 +41,8 @@ import org.mariotaku.sqliteqb.library.ArgsArray;
import org.mariotaku.sqliteqb.library.Columns;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.support.SignInActivity;
import org.mariotaku.twidere.activity.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.SignInActivity;
import org.mariotaku.twidere.adapter.AccountsAdapter;
import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.UserKey;

View File

@ -56,8 +56,7 @@ import org.mariotaku.sqliteqb.library.Columns.Column;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.sqliteqb.library.RawItemArray;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.UserListSelectorActivity;
import org.mariotaku.twidere.activity.UserListSelectorActivity;
import org.mariotaku.twidere.adapter.ComposeAutoCompleteAdapter;
import org.mariotaku.twidere.adapter.SourceAutoCompleteAdapter;
import org.mariotaku.twidere.model.ParcelableUser;
@ -131,12 +130,6 @@ public abstract class BaseFiltersFragment extends AbsContentListViewFragment<Sim
@Override
public boolean onCreateActionMode(final ActionMode mode, final Menu menu) {
mActionMode = mode;
final FragmentActivity activity = getActivity();
if (activity instanceof IThemedActivity) {
ThemeUtils.applySupportActionModeColor(mode,
((IThemedActivity) activity).getCurrentThemeColor(),
((IThemedActivity) activity).getThemeBackgroundOption(), true);
}
setControlVisible(true);
mode.getMenuInflater().inflate(R.menu.action_multi_select_items, menu);
return true;
@ -145,11 +138,6 @@ public abstract class BaseFiltersFragment extends AbsContentListViewFragment<Sim
@Override
public boolean onPrepareActionMode(final ActionMode mode, final Menu menu) {
updateTitle(mode);
final FragmentActivity activity = getActivity();
if (activity instanceof IThemedActivity) {
ThemeUtils.applySupportActionModeItemColor(mode,
((IThemedActivity) activity).getCurrentThemeColor());
}
return true;
}

View File

@ -29,17 +29,12 @@ import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManagerAccessor;
import android.support.v4.text.BidiFormatter;
import android.support.v4.view.LayoutInflaterCompat;
import android.support.v4.view.LayoutInflaterFactory;
import android.view.LayoutInflater;
import android.view.View;
import com.squareup.otto.Bus;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.fragment.iface.IBaseFragment;
import org.mariotaku.twidere.util.AsyncTaskManager;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
@ -50,7 +45,6 @@ import org.mariotaku.twidere.util.MultiSelectManager;
import org.mariotaku.twidere.util.NotificationManagerWrapper;
import org.mariotaku.twidere.util.ReadStateManager;
import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory;
import org.mariotaku.twidere.util.TwidereValidator;
import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
@ -173,19 +167,6 @@ public class BaseSupportFragment extends Fragment implements IBaseFragment, Cons
mActionHelper.dispatchOnResumeFragments();
}
@Override
public LayoutInflater getLayoutInflater(Bundle savedInstanceState) {
final FragmentActivity activity = getActivity();
if (!(activity instanceof IThemedActivity)) {
return super.getLayoutInflater(savedInstanceState);
}
final LayoutInflater inflater = activity.getLayoutInflater().cloneInContext(getThemedContext());
getChildFragmentManager(); // Init if needed; use raw implementation below.
final LayoutInflaterFactory delegate = FragmentManagerAccessor.getLayoutInflaterFactory(getChildFragmentManager());
LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory((IThemedActivity) activity, delegate));
return inflater;
}
@Override
public void onDestroy() {
super.onDestroy();

View File

@ -38,7 +38,7 @@ import org.mariotaku.sqliteqb.library.ArgsArray;
import org.mariotaku.sqliteqb.library.Columns.Column;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.activity.HomeActivity;
import org.mariotaku.twidere.adapter.ParcelableActivitiesAdapter;
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition;
import org.mariotaku.twidere.loader.ExtendedObjectCursorLoader;

View File

@ -38,7 +38,7 @@ import org.mariotaku.sqliteqb.library.ArgsArray;
import org.mariotaku.sqliteqb.library.Columns.Column;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.activity.HomeActivity;
import org.mariotaku.twidere.adapter.ListParcelableStatusesAdapter;
import org.mariotaku.twidere.adapter.ParcelableStatusesAdapter;
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition;

View File

@ -47,8 +47,8 @@ import org.mariotaku.sqliteqb.library.Columns.Column;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IControlBarActivity;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity;
import org.mariotaku.twidere.activity.HomeActivity;
import org.mariotaku.twidere.activity.LinkHandlerActivity;
import org.mariotaku.twidere.adapter.MessageEntriesAdapter;
import org.mariotaku.twidere.adapter.MessageEntriesAdapter.DirectMessageEntry;
import org.mariotaku.twidere.adapter.MessageEntriesAdapter.MessageEntriesAdapterListener;

View File

@ -34,7 +34,7 @@ import android.view.ViewGroup;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IControlBarActivity;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity;
import org.mariotaku.twidere.activity.LinkHandlerActivity;
import org.mariotaku.twidere.adapter.SupportTabsAdapter;
import org.mariotaku.twidere.fragment.iface.IBaseFragment;
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;

View File

@ -32,7 +32,7 @@ import android.view.ViewGroup;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IControlBarActivity;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity;
import org.mariotaku.twidere.activity.LinkHandlerActivity;
import org.mariotaku.twidere.adapter.SupportTabsAdapter;
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback;
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;

View File

@ -75,8 +75,8 @@ import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.sqliteqb.library.OrderBy;
import org.mariotaku.sqliteqb.library.RawItemArray;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.activity.support.ThemedImagePickerActivity;
import org.mariotaku.twidere.activity.BaseAppCompatActivity;
import org.mariotaku.twidere.activity.ThemedImagePickerActivity;
import org.mariotaku.twidere.adapter.AccountsSpinnerAdapter;
import org.mariotaku.twidere.adapter.MessageConversationAdapter;
import org.mariotaku.twidere.adapter.SimpleParcelableUsersAdapter;

View File

@ -44,8 +44,8 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IControlBarActivity;
import org.mariotaku.twidere.activity.iface.IControlBarActivity.ControlBarOffsetListener;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.ComposeActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity;
import org.mariotaku.twidere.activity.ComposeActivity;
import org.mariotaku.twidere.activity.LinkHandlerActivity;
import org.mariotaku.twidere.adapter.SupportTabsAdapter;
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback;
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;

View File

@ -85,7 +85,7 @@ import com.squareup.otto.Subscribe;
import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.ColorPickerDialogActivity;
import org.mariotaku.twidere.adapter.BaseRecyclerViewAdapter;
import org.mariotaku.twidere.adapter.LoadMoreSupportAdapter;
import org.mariotaku.twidere.adapter.ParcelableStatusesAdapter;

View File

@ -85,11 +85,11 @@ import org.apache.commons.lang3.ObjectUtils;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.AccountSelectorActivity;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity;
import org.mariotaku.twidere.activity.support.ThemedAppCompatActivity;
import org.mariotaku.twidere.activity.support.UserListSelectorActivity;
import org.mariotaku.twidere.activity.AccountSelectorActivity;
import org.mariotaku.twidere.activity.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.LinkHandlerActivity;
import org.mariotaku.twidere.activity.ThemedAppCompatActivity;
import org.mariotaku.twidere.activity.UserListSelectorActivity;
import org.mariotaku.twidere.adapter.SupportTabsAdapter;
import org.mariotaku.twidere.api.twitter.Twitter;
import org.mariotaku.twidere.api.twitter.TwitterException;

View File

@ -58,8 +58,8 @@ import com.rengwuxian.materialedittext.MaterialEditText;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.AccountSelectorActivity;
import org.mariotaku.twidere.activity.support.UserListSelectorActivity;
import org.mariotaku.twidere.activity.AccountSelectorActivity;
import org.mariotaku.twidere.activity.UserListSelectorActivity;
import org.mariotaku.twidere.adapter.SupportTabsAdapter;
import org.mariotaku.twidere.api.twitter.Twitter;
import org.mariotaku.twidere.api.twitter.TwitterException;

View File

@ -50,8 +50,8 @@ import com.rengwuxian.materialedittext.MaterialEditText;
import com.twitter.Validator;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.support.ThemedImagePickerActivity;
import org.mariotaku.twidere.activity.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.ThemedImagePickerActivity;
import org.mariotaku.twidere.api.twitter.Twitter;
import org.mariotaku.twidere.api.twitter.TwitterException;
import org.mariotaku.twidere.api.twitter.model.ProfileUpdate;

View File

@ -1,53 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.preference;
import android.content.Context;
import android.util.AttributeSet;
import org.jraf.android.backport.switchwidget.SwitchPreference;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.ThemeUtils;
public class DarkLightThemeTogglePreference extends SwitchPreference implements Constants {
public DarkLightThemeTogglePreference(final Context context) {
this(context, null);
}
public DarkLightThemeTogglePreference(final Context context, final AttributeSet attrs) {
this(context, attrs, R.attr.asb_switchPreferenceStyle);
}
public DarkLightThemeTogglePreference(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected boolean getPersistedBoolean(final boolean defaultReturnValue) {
return ThemeUtils.isDarkTheme(getPersistedString(VALUE_THEME_NAME_LIGHT));
}
@Override
protected boolean persistBoolean(final boolean value) {
return persistString(value ? VALUE_THEME_NAME_DARK : VALUE_THEME_NAME_LIGHT);
}
}

View File

@ -43,7 +43,7 @@ import android.widget.Toast;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.APIEditorActivity;
import org.mariotaku.twidere.activity.APIEditorActivity;
import org.mariotaku.twidere.model.ParcelableCredentials;
import org.mariotaku.twidere.preference.iface.IDialogPreference;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;

View File

@ -77,7 +77,7 @@ import org.mariotaku.sqliteqb.library.query.SQLSelectQuery;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.activity.HomeActivity;
import org.mariotaku.twidere.annotation.CustomTabType;
import org.mariotaku.twidere.annotation.NotificationType;
import org.mariotaku.twidere.annotation.ReadPositionTag;

View File

@ -27,7 +27,7 @@ import android.os.Bundle;
import org.apache.commons.collections.primitives.ArrayIntList;
import org.apache.commons.collections.primitives.IntList;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.activity.HomeActivity;
import edu.tsinghua.hotmobi.HotMobiLogger;
import edu.tsinghua.hotmobi.PreProcessing;

View File

@ -20,7 +20,7 @@ import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.activity.support.MediaViewerActivity;
import org.mariotaku.twidere.activity.MediaViewerActivity;
import org.mariotaku.twidere.constant.SharedPreferenceConstants;
import org.mariotaku.twidere.fragment.support.SensitiveContentWarningDialogFragment;
import org.mariotaku.twidere.fragment.support.UserFragment;

View File

@ -12,8 +12,8 @@ import android.view.KeyEvent;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.ComposeActivity;
import org.mariotaku.twidere.activity.support.QuickSearchBarActivity;
import org.mariotaku.twidere.activity.ComposeActivity;
import org.mariotaku.twidere.activity.QuickSearchBarActivity;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.constant.KeyboardShortcutConstants;

View File

@ -27,8 +27,10 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat;
@ -43,8 +45,8 @@ import android.view.MenuItem;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.activity.support.AccountSelectorActivity;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.AccountSelectorActivity;
import org.mariotaku.twidere.activity.ColorPickerDialogActivity;
import org.mariotaku.twidere.constant.IntentConstants;
import org.mariotaku.twidere.constant.SharedPreferenceConstants;
import org.mariotaku.twidere.fragment.support.AbsStatusesFragment;
@ -81,7 +83,7 @@ public class MenuUtils implements Constants {
item.setChecked(checked);
}
public static void setMenuItemIcon(final Menu menu, final int id, final int icon) {
public static void setMenuItemIcon(final Menu menu, final int id, @DrawableRes final int icon) {
if (menu == null) return;
final MenuItem item = menu.findItem(id);
if (item == null) return;
@ -96,7 +98,7 @@ public class MenuUtils implements Constants {
MenuItemCompat.setShowAsAction(item, flags);
}
public static void setMenuItemTitle(final Menu menu, final int id, final int icon) {
public static void setMenuItemTitle(final Menu menu, final int id, @StringRes final int icon) {
if (menu == null) return;
final MenuItem item = menu.findItem(id);
if (item == null) return;

View File

@ -33,7 +33,7 @@ import com.twitter.Extractor;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.activity.BaseAppCompatActivity;
import org.mariotaku.twidere.menu.AccountActionProvider;
import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableStatus;

View File

@ -28,7 +28,7 @@ import org.mariotaku.restfu.http.HttpRequest;
import org.mariotaku.restfu.http.HttpResponse;
import org.mariotaku.restfu.http.RestHttpClient;
import org.mariotaku.restfu.http.mime.Body;
import org.mariotaku.twidere.activity.support.ThemedImagePickerActivity;
import org.mariotaku.twidere.activity.ThemedImagePickerActivity;
import org.mariotaku.twidere.util.dagger.DependencyHolder;
import java.io.IOException;

View File

@ -36,12 +36,7 @@ import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.app.WindowDecorActionBar;
import android.support.v7.app.WindowDecorActionBar.ActionModeImpl;
import android.support.v7.view.StandaloneActionMode;
import android.support.v7.view.SupportActionModeWrapperAccessor;
import android.support.v7.view.menu.ActionMenuItemView;
import android.support.v7.widget.ActionBarContainer;
import android.support.v7.widget.ActionBarContextView;
@ -52,7 +47,6 @@ import android.support.v7.widget.Toolbar;
import android.support.v7.widget.TwidereToolbar;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.ActionMode;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.ContextThemeWrapper;
import android.view.Menu;
@ -63,13 +57,12 @@ import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.LinkHandlerActivity;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity;
import org.mariotaku.twidere.graphic.ActionBarColorDrawable;
import org.mariotaku.twidere.graphic.ActionIconDrawable;
import org.mariotaku.twidere.graphic.iface.DoNotWrapDrawable;
@ -96,15 +89,6 @@ public class ThemeUtils implements Constants {
}
public static void applyActionBarBackground(final ActionBar actionBar, final Context context,
final int accentColor, String backgroundOption, boolean outlineEnabled) {
if (actionBar == null || context == null) return;
actionBar.setBackgroundDrawable(getActionBarBackground(context, accentColor, backgroundOption, outlineEnabled));
actionBar.setSplitBackgroundDrawable(getActionBarSplitBackground(context));
actionBar.setStackedBackgroundDrawable(getActionBarStackedBackground(context, accentColor, backgroundOption, outlineEnabled));
}
public static void applyActionBarBackground(final ActionBarContainer actionBar, final Context context,
final int accentColor, String backgroundOption, boolean outlineEnabled) {
if (actionBar == null || context == null) return;
@ -139,77 +123,6 @@ public class ThemeUtils implements Constants {
}
}
public static void applySupportActionModeColor(final ActionMode mode,
int accentColor, String backgroundOption,
boolean outlineEnabled) {
android.support.v7.view.ActionMode modeCompat = SupportActionModeWrapperAccessor.getWrappedObject(mode);
if (modeCompat == null) return;
applySupportActionModeColor(modeCompat, accentColor, backgroundOption,
outlineEnabled);
}
public static void applySupportActionModeColor(final android.support.v7.view.ActionMode modeCompat,
int accentColor, String backgroundOption,
boolean outlineEnabled) {
// Very dirty implementation
// This call ensures TitleView created
modeCompat.setTitle(modeCompat.getTitle());
final View contextView = findActionBarContextView(modeCompat);
if (!(contextView instanceof ActionBarContextView)) return;
setActionBarContextViewBackground((ActionBarContextView) contextView, accentColor,
backgroundOption, outlineEnabled);
}
public static void applySupportActionModeItemColor(final ActionMode mode, int accentColor) {
android.support.v7.view.ActionMode modeCompat = SupportActionModeWrapperAccessor.getWrappedObject(mode);
if (modeCompat == null) return;
applySupportActionModeItemColor(modeCompat, accentColor);
}
public static void applySupportActionModeItemColor(final android.support.v7.view.ActionMode modeCompat,
int accentColor) {
// Very dirty implementation
// This call ensures TitleView created
modeCompat.setTitle(modeCompat.getTitle());
final View contextView = findActionBarContextView(modeCompat);
if (!(contextView instanceof ActionBarContextView)) return;
setActionBarContextViewItemColor((ActionBarContextView) contextView, accentColor);
}
private static void setActionBarContextViewItemColor(ActionBarContextView contextView, int toolbarColor) {
final Context context = contextView.getContext();
final int contrastForegroundColor = getContrastForegroundColor(context, toolbarColor);
if (isDarkTheme(context)) {
return;
}
final View titleView = contextView.findViewById(R.id.action_bar_title);
final View subtitleView = contextView.findViewById(R.id.action_bar_subtitle);
final View closeButton = contextView.findViewById(R.id.action_mode_close_button);
if (titleView instanceof TextView) {
((TextView) titleView).setTextColor(contrastForegroundColor);
}
if (subtitleView instanceof TextView) {
((TextView) subtitleView).setTextColor(contrastForegroundColor);
}
if (closeButton instanceof ImageView) {
((ImageView) closeButton).setColorFilter(contrastForegroundColor, Mode.SRC_ATOP);
}
}
private static View findActionBarContextView(final android.support.v7.view.ActionMode modeCompat) {
if (modeCompat instanceof ActionModeImpl) {
WindowDecorActionBar actionBar = (WindowDecorActionBar) Utils.findFieldOfTypes(modeCompat,
ActionModeImpl.class, WindowDecorActionBar.class);
if (actionBar == null) return null;
return (View) Utils.findFieldOfTypes(actionBar, WindowDecorActionBar.class,
ActionBarContextView.class);
} else if (modeCompat instanceof StandaloneActionMode) {
return (View) Utils.findFieldOfTypes(modeCompat, StandaloneActionMode.class,
ActionBarContextView.class);
}
return null;
}
public static void setActionBarContextViewBackground(@NonNull ActionBarContextView contextView,
int accentColor,
String backgroundOption, boolean outlineEnabled) {
@ -1019,6 +932,15 @@ public class ThemeUtils implements Constants {
| Configuration.UI_MODE_NIGHT_YES;
}
public static String getATEKey(Context context) {
TypedValue value = new TypedValue();
if (!context.getTheme().resolveAttribute(R.attr.ateThemeKey, value, true)) {
return "dark";
}
if (TextUtils.isEmpty(value.string)) return "dark";
return String.valueOf(value.string);
}
public static final class ActionBarContextThemeWrapper extends android.support.v7.view.ContextThemeWrapper {

View File

@ -1,269 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.util;
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.Typeface;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.LayoutInflaterFactory;
import android.support.v4.view.TintableBackgroundView;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.app.AppCompatDelegateAccessor;
import android.support.v7.view.ContextThemeWrapper;
import android.support.v7.widget.TwidereToolbar;
import android.util.AttributeSet;
import android.view.InflateException;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.rengwuxian.materialedittext.MaterialEditText;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.view.ProfileImageView;
import org.mariotaku.twidere.view.ShapedImageView;
import org.mariotaku.twidere.view.WizardHighlightTextView;
import org.mariotaku.twidere.view.iface.IThemeAccentView;
import org.mariotaku.twidere.view.iface.IThemeBackgroundTintView;
import org.mariotaku.twidere.view.themed.ThemedTextView;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
/**
* Created by mariotaku on 15/4/22.
*/
public class ThemedLayoutInflaterFactory implements LayoutInflaterFactory {
private static final String[] sCustomViewPrefixWhiteList = {"org.mariotaku.twidere.view"};
private static final Map<String, Constructor> sConstructorCache = new HashMap<>();
private final IThemedActivity activity;
private final LayoutInflaterFactory delegate;
public ThemedLayoutInflaterFactory(IThemedActivity activity, LayoutInflaterFactory delegate) {
this.activity = activity;
this.delegate = delegate;
}
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
View view = delegate.onCreateView(parent, name, context, attrs);
if (view == null) {
view = createCustomView(name, context, attrs);
}
initView(view, activity);
return view;
}
public static View createCustomView(String name, Context context, AttributeSet attrs) {
if (!name.contains(".")) return null;
boolean whiteListed = false;
for (String prefix : sCustomViewPrefixWhiteList) {
if (name.startsWith(prefix)) {
whiteListed = true;
break;
}
}
if (!whiteListed) return null;
//noinspection TryWithIdenticalCatches
try {
Constructor<?> constructor = sConstructorCache.get(name);
if (constructor == null) {
final Class<?> viewCls = Class.forName(name);
if (!View.class.isAssignableFrom(viewCls)) return null;
constructor = viewCls.getConstructor(Context.class, AttributeSet.class);
sConstructorCache.put(name, constructor);
}
return (View) constructor.newInstance(context, attrs);
} catch (ClassNotFoundException ignore) {
} catch (NoSuchMethodException e) {
throw new InflateException(e);
} catch (InvocationTargetException e) {
throw new InflateException(e);
} catch (InstantiationException e) {
throw new InflateException(e);
} catch (IllegalAccessException e) {
throw new InflateException(e);
}
return null;
}
public static void initView(View view, IThemedActivity activity) {
if (view == null) return;
if (view instanceof ShapedImageView) {
final ShapedImageView shapedImageView = (ShapedImageView) view;
shapedImageView.setStyle(activity.getCurrentProfileImageStyle());
}
if (view instanceof ProfileImageView) {
final ProfileImageView profileImageView = (ProfileImageView) view;
profileImageView.setOval(activity.getCurrentProfileImageStyle() == ShapedImageView.SHAPE_CIRCLE);
}
if (view instanceof ThemedTextView) {
final String fontFamily = activity.getCurrentThemeFontFamily();
final TextView textView = (TextView) view;
final Typeface defTypeface = textView.getTypeface();
textView.setTypeface(ThemeUtils.getUserTypeface((Context) activity, fontFamily, defTypeface));
}
initViewTint(view, activity);
}
private static void initViewTint(View view, IThemedActivity activity) {
final int noTintColor, accentColor, backgroundTintColor;
final boolean isColorTint;
// View context is not derived from ActionBar, apply color tint directly
final Context viewContext = view.getContext();
final boolean isActionBarContext = isActionBarContext(viewContext, getActionBarContext((Activity) activity));
final boolean isDarkTheme = ThemeUtils.isDarkTheme(viewContext);
final int backgroundColorApprox;
final int currentThemeColor = activity.getCurrentThemeColor();
if (!isActionBarContext) {
accentColor = currentThemeColor;
final int[] darkLightColors = new int[2];
ThemeUtils.getDarkLightForegroundColors((Context) activity,
darkLightColors);
noTintColor = TwidereColorUtils.getContrastYIQ(accentColor, ThemeUtils.ACCENT_COLOR_THRESHOLD,
darkLightColors[0], darkLightColors[1]);
backgroundTintColor = accentColor;
backgroundColorApprox = isDarkTheme ? Color.BLACK : Color.WHITE;
isColorTint = true;
} else if (isDarkTheme) {
// View context is derived from ActionBar but is currently dark theme, so we should show
// light
noTintColor = Color.WHITE;
accentColor = currentThemeColor;
backgroundTintColor = noTintColor;
backgroundColorApprox = Color.BLACK;
isColorTint = true;
} else {
// View context is derived from ActionBar and it's light theme, so we use contrast color
accentColor = ThemeUtils.getColorFromAttribute(viewContext, android.R.attr.colorForeground, 0);
noTintColor = ThemeUtils.getColorFromAttribute(viewContext, android.R.attr.colorBackground, 0);
backgroundTintColor = accentColor;
backgroundColorApprox = Color.WHITE;
isColorTint = false;
}
final boolean isAccentOptimal = Math.abs(TwidereColorUtils.getYIQContrast(backgroundColorApprox, accentColor)) > 64;
if (view instanceof TextView) {
final TextView textView = (TextView) view;
if (isAccentOptimal) {
textView.setLinkTextColor(accentColor);
}
}
if (view instanceof WizardHighlightTextView) {
((WizardHighlightTextView) view).setTextColor(ThemeUtils.getOptimalAccentColor((Context) activity,
currentThemeColor, isActionBarContext));
}
if (view instanceof IThemeAccentView) {
if (isAccentOptimal || !isColorTint) {
((IThemeAccentView) view).setAccentTintColor(ColorStateList.valueOf(accentColor));
} else {
final int defaultAccentColor = ThemeUtils.getColorFromAttribute(viewContext,
R.attr.colorAccent, ContextCompat.getColor(viewContext, R.color.branding_color));
((IThemeAccentView) view).setAccentTintColor(ColorStateList.valueOf(defaultAccentColor));
}
} else if (view instanceof IThemeBackgroundTintView) {
if (isAccentOptimal || !isColorTint) {
((IThemeBackgroundTintView) view).setBackgroundTintColor(ColorStateList.valueOf(backgroundTintColor));
}
} else if (view instanceof TwidereToolbar) {
if (viewContext instanceof ContextThemeWrapper) {
((TwidereToolbar) view).setItemColor(ThemeUtils.getThemeForegroundColor(viewContext,
((ContextThemeWrapper) viewContext).getThemeResId()));
} else {
((TwidereToolbar) view).setItemColor(ThemeUtils.getThemeForegroundColor(viewContext));
}
} else if (view instanceof EditText) {
if (isAccentOptimal || !isColorTint) {
ViewCompat.setBackgroundTintList(view, ColorStateList.valueOf(backgroundTintColor));
}
if (view instanceof MaterialEditText) {
if (isAccentOptimal || !isColorTint) {
((MaterialEditText) view).setPrimaryColor(backgroundTintColor);
}
}
} else if (view instanceof ProgressBar) {
if (isAccentOptimal || !isColorTint) {
ViewSupport.setIndeterminateTintList((ProgressBar) view, ColorStateList.valueOf(accentColor));
ViewSupport.setProgressTintList((ProgressBar) view, ColorStateList.valueOf(accentColor));
ViewSupport.setProgressBackgroundTintList((ProgressBar) view, ColorStateList.valueOf(accentColor));
}
} else if (view instanceof TintableBackgroundView) {
final TintableBackgroundView tintable = (TintableBackgroundView) view;
if (isAccentOptimal || !isColorTint) {
applyTintableBackgroundViewTint(tintable, accentColor, noTintColor, backgroundTintColor, isColorTint);
}
}
}
private static void applyTintableBackgroundViewTint(TintableBackgroundView tintable, int accentColor, int noTintColor, int backgroundTintColor, boolean isColorTint) {
if (tintable instanceof Button) {
} else if (tintable instanceof EditText) {
tintable.setSupportBackgroundTintList(ColorStateList.valueOf(backgroundTintColor));
} else if (isColorTint) {
// final int[][] states = {{android.R.attr.state_selected}, {android.R.attr.state_focused},
// {android.R.attr.state_pressed}, {0}};
// final int[] colors = {accentColor, accentColor, accentColor, noTintColor};
// tintable.setSupportBackgroundTintList(new ColorStateList(states, colors));
} else {
// tintable.setSupportBackgroundTintList(ColorStateList.valueOf(accentColor));
}
}
private static boolean isActionBarContext(@NonNull Context context, @Nullable Context actionBarContext) {
if (context instanceof ThemeUtils.ActionBarContextThemeWrapper) return true;
if (actionBarContext == null) return false;
if (context == actionBarContext) return true;
Context base = context;
while (base instanceof ContextWrapper && (base = ((ContextWrapper) base).getBaseContext()) != null) {
if (base == actionBarContext) return true;
}
return false;
}
@Nullable
private static Context getActionBarContext(@NonNull Activity activity) {
Context actionBarContext = null;
if (activity instanceof AppCompatActivity) {
final AppCompatDelegate delegate = ((AppCompatActivity) activity).getDelegate();
final ActionBar actionBar = AppCompatDelegateAccessor.peekActionBar(delegate);
if (actionBar != null) {
actionBarContext = actionBar.getThemedContext();
}
}
if (activity != actionBarContext) return actionBarContext;
return null;
}
}

View File

@ -21,12 +21,10 @@ package org.mariotaku.twidere.util.dagger;
import android.support.v7.widget.RecyclerView;
import org.mariotaku.twidere.activity.BasePreferenceActivity;
import org.mariotaku.twidere.activity.BaseThemedActivity;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.activity.support.ComposeActivity;
import org.mariotaku.twidere.activity.support.MediaViewerActivity;
import org.mariotaku.twidere.activity.support.ThemedFragmentActivity;
import org.mariotaku.twidere.activity.BaseAppCompatActivity;
import org.mariotaku.twidere.activity.ComposeActivity;
import org.mariotaku.twidere.activity.ThemedFragmentActivity;
import org.mariotaku.twidere.activity.MediaViewerActivity;
import org.mariotaku.twidere.adapter.AccountsAdapter;
import org.mariotaku.twidere.adapter.AccountsSpinnerAdapter;
import org.mariotaku.twidere.adapter.BaseArrayAdapter;
@ -74,10 +72,6 @@ public interface GeneralComponent {
void inject(MultiSelectEventHandler object);
void inject(BasePreferenceActivity object);
void inject(BaseThemedActivity object);
void inject(BaseSupportDialogFragment object);
void inject(RefreshService object);
@ -114,8 +108,6 @@ public interface GeneralComponent {
void inject(BaseFiltersFragment.FilteredUsersFragment.FilterUsersListAdapter object);
void inject(AccountsDashboardFragment.OptionItemsAdapter object);
void inject(EmojiSpannableFactory object);
void inject(EmojiEditableFactory object);

View File

@ -39,4 +39,5 @@ public class DrawerContentFrameLayout extends FrameLayout {
super(context, attrs, defStyle);
ThemeUtils.setupDrawerBackground(context, this);
}
}

View File

@ -22,6 +22,7 @@ package org.mariotaku.twidere.view;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.annotation.NonNull;

View File

@ -1,163 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.view;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.os.Build;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.util.Property;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.util.support.graphics.OutlineCompat;
import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat;
import org.mariotaku.twidere.view.iface.IHomeActionButton;
import me.uucky.colorpicker.internal.EffectViewHelper;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class HomeActionButton extends FrameLayout implements IHomeActionButton {
private static class PressElevationProperty extends Property<View, Float> {
private final float mElevation;
public PressElevationProperty(float elevation) {
super(Float.TYPE, null);
mElevation = elevation;
}
@Override
public void set(View object, Float value) {
ViewCompat.setTranslationZ(object, mElevation * value);
}
@Override
public Float get(View object) {
return ViewCompat.getTranslationZ(object) / mElevation;
}
}
private final EffectViewHelper mHelper;
private final ImageView mIconView;
public HomeActionButton(final Context context) {
this(context, null);
}
public HomeActionButton(final Context context, final AttributeSet attrs) {
this(context, attrs, 0);
}
public HomeActionButton(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
final Resources resources = context.getResources();
final float elevation = resources.getDisplayMetrics().density * 4;
mHelper = new EffectViewHelper(this, new PressElevationProperty(elevation), 200);
if (isInEditMode()) {
inflate(context, R.layout.action_item_home_actions, this);
} else if (context instanceof IThemedActivity) {
int themeColor = ((IThemedActivity) context).getCurrentThemeColor();
inflate(ThemeUtils.getActionBarThemedContext(context, themeColor),
R.layout.action_item_home_actions, this);
} else {
inflate(ThemeUtils.getActionBarThemedContext(context), R.layout.action_item_home_actions,
this);
}
mIconView = (ImageView) findViewById(android.R.id.icon);
ViewSupport.setOutlineProvider(this, new HomeActionButtonOutlineProvider());
setClipToOutline(true);
setButtonColor(Color.WHITE);
}
@Override
public void setButtonColor(int color) {
if (isInEditMode()) {
final ShapeDrawable sd = new ShapeDrawable(new OvalShape());
sd.getPaint().setColor(color);
ViewSupport.setBackground(this, sd);
} else {
ViewSupport.setBackground(this, new ColorDrawable(color));
}
}
@Override
public void setIcon(final Bitmap bm) {
mIconView.setImageBitmap(bm);
}
@Override
public void setIcon(final Drawable drawable) {
mIconView.setImageDrawable(drawable);
}
@Override
public void setIcon(final int resId) {
mIconView.setImageResource(resId);
}
@Override
public void setIconColor(int color, Mode mode) {
mIconView.setColorFilter(color, mode);
}
@Override
public void setTitle(final CharSequence title) {
setContentDescription(title);
}
@Override
public void setTitle(final int title) {
setTitle(getResources().getText(title));
}
@Override
public void setPressed(boolean pressed) {
super.setPressed(pressed);
mHelper.setState(pressed);
}
private static class HomeActionButtonOutlineProvider extends ViewOutlineProviderCompat {
@Override
public void getOutline(View view, OutlineCompat outline) {
final int width = view.getWidth(), height = view.getHeight();
final int size = Math.min(width, height);
final int left = (width - size) / 2, top = (height - size) / 2;
outline.setOval(left, top, left + size, top + size);
}
}
}

View File

@ -1,203 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.view;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.view.iface.IHomeActionButton;
public class HomeActionButtonCompat extends FrameLayout implements IHomeActionButton {
private final ImageView mIconView;
private final FloatingActionDrawable mBackground;
public HomeActionButtonCompat(final Context context) {
this(context, null);
}
public HomeActionButtonCompat(final Context context, final AttributeSet attrs) {
this(context, attrs, 0);
}
public HomeActionButtonCompat(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
if (isInEditMode()) {
inflate(context, R.layout.action_item_home_actions_compat, this);
} else if (context instanceof IThemedActivity) {
int themeColor = ((IThemedActivity) context).getCurrentThemeColor();
inflate(ThemeUtils.getActionBarThemedContext(context, themeColor),
R.layout.action_item_home_actions_compat, this);
} else {
inflate(ThemeUtils.getActionBarThemedContext(context), R.layout.action_item_home_actions_compat,
this);
}
mIconView = (ImageView) findViewById(android.R.id.icon);
final Resources resources = getResources();
final int radius = resources.getDimensionPixelSize(R.dimen.element_spacing_small);
mBackground = new FloatingActionDrawable(this, radius);
ViewSupport.setBackground(this, mBackground);
}
@Override
public void setButtonColor(int color) {
mBackground.setColor(color);
}
@Override
public void setIcon(final Bitmap bm) {
mIconView.setImageBitmap(bm);
}
@Override
public void setIcon(final Drawable drawable) {
mIconView.setImageDrawable(drawable);
}
@Override
public void setIcon(final int resId) {
mIconView.setImageResource(resId);
}
@Override
public void setIconColor(int color, Mode mode) {
mIconView.setColorFilter(color, mode);
}
@Override
public void setTitle(final CharSequence title) {
setContentDescription(title);
}
@Override
public void setTitle(final int title) {
setTitle(getResources().getText(title));
}
private static class FloatingActionDrawable extends Drawable {
private static final int SHADOW_START_COLOR = 0x37000000;
private final View mView;
private final float mRadius;
private Bitmap mBitmap;
private Paint mColorPaint;
private Rect mBounds;
public FloatingActionDrawable(View view, float radius) {
mView = view;
mRadius = radius;
mColorPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBounds = new Rect();
}
@Override
public void draw(Canvas canvas) {
if (mBitmap != null) {
canvas.drawBitmap(mBitmap, 0, 0, null);
}
final Rect bounds = mBounds;
if (!bounds.isEmpty()) {
final RectF rect = new RectF(mView.getPaddingLeft(), mView.getPaddingTop(),
bounds.width() - mView.getPaddingRight(), bounds.height() - mView.getPaddingBottom());
canvas.drawOval(rect, mColorPaint);
}
}
@Override
public void setAlpha(int alpha) {
// No-op
}
@Override
public void setColorFilter(ColorFilter cf) {
mColorPaint.setColorFilter(cf);
invalidateSelf();
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
@Override
protected void onBoundsChange(Rect bounds) {
super.onBoundsChange(bounds);
mBounds.set(bounds);
updateBitmap();
invalidateSelf();
}
@Override
public int getIntrinsicWidth() {
return -1;
}
@Override
public int getIntrinsicHeight() {
return -1;
}
public void setColor(int color) {
mColorPaint.setColor(color);
updateBitmap();
invalidateSelf();
}
private void updateBitmap() {
final Rect bounds = mBounds;
if (bounds.isEmpty()) return;
mBitmap = Bitmap.createBitmap(bounds.width(), bounds.height(), Config.ARGB_8888);
final Canvas canvas = new Canvas(mBitmap);
final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(0xFF000000 | mColorPaint.getColor());
final float radius = mRadius;
paint.setShadowLayer(radius, 0, radius * 1.5f / 2, SHADOW_START_COLOR);
final RectF rect = new RectF(mView.getPaddingLeft(), mView.getPaddingTop(),
bounds.width() - mView.getPaddingRight(), bounds.height() - mView.getPaddingBottom());
canvas.drawOval(rect, paint);
paint.setShadowLayer(0, 0, 0, 0);
paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
canvas.drawOval(rect, paint);
}
}
}

View File

@ -1,24 +0,0 @@
package org.mariotaku.twidere.view.iface;
import android.graphics.Bitmap;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
/**
* Created by mariotaku on 14/10/23.
*/
public interface IHomeActionButton {
void setButtonColor(int color);
void setIcon(Bitmap bm);
void setIcon(Drawable drawable);
void setIcon(int resId);
void setIconColor(int color, PorterDuff.Mode mode);
void setTitle(CharSequence title);
void setTitle(int title);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 519 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 528 B

View File

@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ Twidere - Twitter client for Android
~
~ Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
~
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<org.mariotaku.twidere.view.HomeActionButton
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/actions_button"
android:layout_width="@dimen/float_action_button_size"
android:layout_height="@dimen/float_action_button_size"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/element_spacing_large"
android:elevation="@dimen/element_spacing_small" />

View File

@ -17,16 +17,17 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<org.mariotaku.twidere.view.TintedStatusNativeActionModeAwareLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
<org.mariotaku.twidere.view.TintedStatusNativeActionModeAwareLayout
android:id="@+id/main_content"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/content_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent"/>
<RelativeLayout
android:id="@+id/twidere_action_bar_with_overlay"
@ -41,13 +42,13 @@
android:layout_height="?actionBarSize"
android:layout_alignParentTop="true"
android:touchscreenBlocksFocus="true"
tools:ignore="UnusedAttribute" />
tools:ignore="UnusedAttribute"/>
<View
android:id="@+id/window_overlay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/twidere_action_bar_container"
android:background="?android:windowContentOverlay" />
android:background="?android:windowContentOverlay"/>
</RelativeLayout>
</org.mariotaku.twidere.view.TintedStatusNativeActionModeAwareLayout>

View File

@ -17,23 +17,25 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
<android.support.v4.widget.DrawerLayout
android:id="@+id/home_menu"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<include
layout="@layout/activity_home_content"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent"/>
<include
layout="@layout/drawer_home_accounts"
<fragment
android:id="@+id/left_drawer"
class="org.mariotaku.twidere.fragment.support.AccountsDashboardFragment"
android:layout_width="@dimen/drawer_width_home"
android:layout_height="match_parent"
android:layout_gravity="left"
tools:ignore="RtlHardcoded" />
android:layout_gravity="start"
tools:layout="@layout/fragment_accounts_dashboard"/>
</android.support.v4.widget.DrawerLayout>

View File

@ -17,10 +17,10 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<org.mariotaku.twidere.view.MainFrameLayout
<org.mariotaku.twidere.view.ExtendedFrameLayout
android:id="@+id/home_content"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -32,29 +32,33 @@
<include layout="@layout/layout_empty_tab_hint"/>
<RelativeLayout
android:id="@+id/twidere_action_bar_with_overlay"
<android.support.v7.widget.Toolbar
android:id="@+id/action_bar"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:elevation="@dimen/toolbar_elevation"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:contentInsetEnd="0dp"
app:contentInsetStart="0dp">
<org.mariotaku.twidere.view.TabPagerIndicator
android:id="@+id/main_tabs"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:tabDisplayOption="icon"
app:tabExpandEnabled="true"
app:tabHorizontalPadding="@dimen/element_spacing_normal"/>
</android.support.v7.widget.Toolbar>
<android.support.design.widget.FloatingActionButton
android:id="@+id/actions_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/element_spacing_large"
android:clickable="true"
android:src="@drawable/ic_action_status_compose"
app:elevation="6dp"
app:pressedTranslationZ="12dp"/>
<org.mariotaku.twidere.view.TwidereActionBarContainer
android:id="@+id/twidere_action_bar_container"
style="?attr/actionBarStyle"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:layout_alignParentTop="true"
android:layout="@layout/layout_actionbar_home"
android:touchscreenBlocksFocus="true"
tools:ignore="UnusedAttribute"/>
<View
android:id="@+id/window_overlay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/twidere_action_bar_container"
android:background="?android:windowContentOverlay"/>
</RelativeLayout>
<include layout="@layout/layout_home_actions_button"/>
</org.mariotaku.twidere.view.MainFrameLayout>
</org.mariotaku.twidere.view.ExtendedFrameLayout>

View File

@ -26,7 +26,7 @@
android:divider="?android:dividerVertical"
android:orientation="vertical"
android:showDividers="middle"
tools:context=".activity.support.RequestPermissionsActivity">
tools:context=".activity.RequestPermissionsActivity">
<ScrollView
android:layout_width="match_parent"

View File

@ -23,8 +23,8 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:focusable="true"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:focusable="true">
<fragment
android:id="@+id/left_drawer"

View File

@ -17,14 +17,14 @@
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<ListView
android:id="@android:id/list"
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null"
android:dividerHeight="0dp"
android:focusable="true"
android:listSelector="?selectableItemBackground"
app:headerLayout="@layout/header_drawer_account_selector"
app:menu="@menu/menu_account_dashboard"
tools:context=".fragment.support.AccountsDashboardFragment"/>

View File

@ -17,7 +17,9 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<RelativeLayout
android:id="@+id/account_dashboard_header"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
@ -36,7 +38,7 @@
android:focusable="false"
android:foreground="@color/drawer_banner_foreground"
android:scaleType="centerCrop"
tools:src="@drawable/nyan_stars_background" />
tools:src="@drawable/nyan_stars_background"/>
<FrameLayout
android:id="@+id/profile_container"
@ -64,7 +66,7 @@
android:focusable="false"
app:sivBorder="true"
app:sivBorderWidth="2dp"
tools:src="@mipmap/ic_launcher" />
tools:src="@mipmap/ic_launcher"/>
<org.mariotaku.twidere.view.ExtendedRecyclerView
android:id="@+id/other_accounts_list"
@ -78,7 +80,7 @@
android:layout_toEndOf="@id/profile_image"
android:layout_toRightOf="@id/profile_image"
android:focusable="false"
tools:visibility="invisible" />
tools:visibility="invisible"/>
<LinearLayout
android:layout_width="match_parent"
@ -104,9 +106,9 @@
android:focusable="false"
android:singleLine="true"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?attr/textColorDrawerNamePrimary"
android:textColor="@android:color/white"
android:textStyle="bold"
tools:text="Name" />
tools:text="Name"/>
<TextView
android:id="@+id/screen_name"
@ -115,8 +117,8 @@
android:focusable="false"
android:singleLine="true"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?textColorDrawerNameSecondary"
tools:text="\@username" />
android:textColor="@color/light_gray"
tools:text="\@username"/>
</LinearLayout>
@ -129,7 +131,7 @@
android:id="@+id/account_dashboard_menu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true" />
android:focusable="true"/>
</FrameLayout>
@ -143,7 +145,7 @@
android:focusable="false"
android:scaleType="fitCenter"
android:visibility="invisible"
tools:ignore="ContentDescription" />
tools:ignore="ContentDescription"/>
</FrameLayout>
<FrameLayout
@ -159,7 +161,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/no_account" />
android:text="@string/no_account"/>
</FrameLayout>

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:layout_height="?actionBarSize"
tools:layout_width="match_parent">
<android.support.v7.widget.TwidereToolbar
android:id="@+id/action_bar"
style="?attr/toolbarStyle"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:contentInsetEnd="0dp"
app:contentInsetStart="0dp">
<org.mariotaku.twidere.view.TabPagerIndicator
android:id="@+id/main_tabs"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:tabDisplayOption="icon"
app:tabExpandEnabled="true"
app:tabHorizontalPadding="@dimen/element_spacing_normal"/>
</android.support.v7.widget.TwidereToolbar>
</merge>

View File

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Twidere - Twitter client for Android
~
~ Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
~
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<org.mariotaku.twidere.view.HomeActionButtonCompat
android:id="@+id/actions_button"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:padding="@dimen/element_spacing_large"
android:visibility="visible"/>

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group
android:id="@+id/account_actions"
android:checkableBehavior="none">
<item
android:id="@id/search"
android:icon="@drawable/ic_action_search"
android:title="@string/search"/>
<item
android:id="@id/interactions"
android:icon="@drawable/ic_action_notification"
android:title="@string/interactions"/>
<item
android:id="@id/messages"
android:icon="@drawable/ic_action_message"
android:title="@string/direct_messages"/>
<item
android:id="@id/favorites"
android:icon="@drawable/ic_action_heart"
android:title="@string/likes"/>
<item
android:id="@id/lists"
android:icon="@drawable/ic_action_list"
android:title="@string/likes"/>
<item
android:id="@id/groups"
android:icon="@drawable/ic_action_list"
android:title="@string/groups"/>
<item
android:id="@id/public_timeline"
android:icon="@drawable/ic_action_quote"
android:title="@string/public_timeline"/>
</group>
<group
android:id="@+id/app_menu"
android:checkableBehavior="none">
<item
android:id="@id/accounts"
android:icon="@drawable/ic_action_accounts"
android:title="@string/accounts"/>
<item
android:id="@id/drafts"
android:icon="@drawable/ic_action_draft"
android:title="@string/drafts"/>
<item
android:id="@id/filters"
android:icon="@drawable/ic_action_speaker_muted"
android:title="@string/filters"/>
<item
android:id="@id/settings"
android:icon="@drawable/ic_action_settings"
android:title="@string/settings"/>
</group>
</menu>

View File

@ -18,7 +18,8 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item>
<item name="coloredActionBar">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item>
<!-- ATE attributes -->
<item name="ateThemeKey">light</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style>
@ -41,7 +42,8 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item>
<item name="coloredActionBar">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item>
<!-- ATE attributes -->
<item name="ateThemeKey">light</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style>
@ -69,7 +71,9 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item>
<item name="coloredActionBar">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item>
<!-- ATE attributes -->
<item name="ateThemeKey">light</item>
</style>
@ -94,7 +98,9 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item>
<item name="coloredActionBar">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item>
<!-- ATE attributes -->
<item name="ateThemeKey">light</item>
</style>
@ -130,7 +136,9 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item>
<item name="coloredActionBar">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item>
<!-- ATE attributes -->
<item name="ateThemeKey">light</item>
</style>
<style name="Theme.Twidere.QuickSearchBar" parent="Theme.Twidere.Dialog">
@ -145,8 +153,6 @@
<style name="Theme.Twidere.Drawer" parent="Theme.Twidere.NoActionBar">
<!-- Window attributes -->
<item name="android:windowBackground">@color/bg_color_drawer_light</item>
<item name="textColorDrawerNamePrimary">?android:textColorPrimaryInverse</item>
<item name="textColorDrawerNameSecondary">?android:textColorSecondaryInverse</item>
</style>
<style name="Theme.Twidere.NoDisplay" parent="Theme.Twidere.Dialog">

View File

@ -12,10 +12,9 @@
<attr name="cardItemBackgroundColor" format="color"/>
<attr name="quoteIndicatorBackgroundColor" format="color"/>
<attr name="linePageIndicatorStyle" format="reference"/>
<attr name="textColorDrawerNamePrimary" format="color"/>
<attr name="textColorDrawerNameSecondary" format="color"/>
<attr name="progressWheelStyle" format="reference"/>
<attr name="darkTheme" format="boolean"/>
<attr name="ateThemeKey" format="string"/>
<attr name="coloredActionBar" format="boolean"/>
<attr name="windowNormalBackground" format="reference"/>
</declare-styleable>

View File

@ -96,5 +96,6 @@
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="height_player_control_panel">40dp</dimen>
<dimen name="toolbar_elevation">8dp</dimen>
</resources>

View File

@ -20,7 +20,8 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item>
<item name="darkTheme">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item>
<!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style>
@ -46,7 +47,8 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item>
<item name="darkTheme">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item>
<!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style>
@ -73,7 +75,9 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item>
<item name="darkTheme">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item>
<!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
</style>
<style name="Theme.Twidere.Dialog" parent="Theme.Compat.Base.Dialog">
@ -97,7 +101,9 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item>
<item name="darkTheme">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item>
<!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
</style>
<style name="Theme.Twidere.Compose" parent="Theme.Compat.Base.Dialog">
@ -131,7 +137,9 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item>
<item name="darkTheme">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item>
<!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
</style>
<style name="Theme.Twidere.QuickSearchBar" parent="Theme.Twidere.Dialog">
@ -143,15 +151,20 @@
<item name="android:windowActionModeOverlay">false</item>
<item name="darkTheme">true</item>
<!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
</style>
<style name="Theme.Twidere.Drawer" parent="Theme.Twidere.NoActionBar">
<!-- Window attributes -->
<item name="android:windowBackground">@color/bg_color_drawer_dark</item>
<item name="textColorDrawerNamePrimary">?android:textColorPrimary</item>
<item name="textColorDrawerNameSecondary">?android:textColorSecondary</item>
<item name="darkTheme">true</item>
<!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
</style>
<style name="Theme.Twidere.NoDisplay" parent="Theme.Twidere.Dialog">
@ -166,7 +179,10 @@
<item name="android:windowTitleStyle">@style/Widget.TextView.WindowTitle.NoDisplay</item>
<item name="darkTheme">true</item>
<!--<item name="android:windowNoDisplay">true</item>-->
<!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
</style>
<style name="Theme.Twidere.Viewer" parent="Theme.AppCompat">
@ -195,8 +211,11 @@
<item name="messageBubbleColor">@color/message_bubble_color_dark</item>
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item>
<item name="darkTheme">true</item>
<!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
</style>
<style name="Theme.Nyan" parent="Theme.Compat.Base.NoActionBar">

View File

@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:key="settings_content"
android:title="@string/content_and_storage">
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:key="settings_content"
android:title="@string/content_and_storage">
<PreferenceCategory
android:key="category_content"
@ -11,9 +12,9 @@
<SwitchPreference
android:defaultValue="true"
android:key="name_first"
android:title="@string/name_first"
app:asb_summaryOff="@string/name_first_summary_off"
app:asb_summaryOn="@string/name_first_summary_on">
android:summaryOff="@string/name_first_summary_off"
android:summaryOn="@string/name_first_summary_on"
android:title="@string/name_first">
<extra
android:name="notify_change"
android:value="true"/>

View File

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<!-- Generator: Sketch 3.4 (15588) - http://www.bohemiancoding.com/sketch -->
<title>Artboard</title>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 3.6.1 (26313) - http://www.bohemiancoding.com/sketch -->
<title>ic_action_heart-mdpi</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="Artboard" sketch:type="MSArtboardGroup" fill="#FFFFFF">
<path d="M16,24.5708333 L14.6708333,23.3608333 C9.95,19.08 6.83333333,16.2566667 6.83333333,12.7916667 C6.83333333,9.96833333 9.05166667,7.75 11.875,7.75 C13.47,7.75 15.0008333,8.4925 16,9.66583333 C16.9991667,8.4925 18.53,7.75 20.125,7.75 C22.9483333,7.75 25.1666667,9.96833333 25.1666667,12.7916667 C25.1666667,16.2566667 22.05,19.08 17.3291667,23.37 L16,24.5708333 L16,24.5708333 Z" id="Shape" sketch:type="MSShapeGroup"></path>
<g id="Action-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="ic_action_heart-mdpi" fill="#FFFFFF">
<path d="M16,25.35 L14.55,24.03 C9.4,19.36 6,16.28 6,12.5 C6,9.42 8.42,7 11.5,7 C13.24,7 14.91,7.81 16,9.09 C17.09,7.81 18.76,7 20.5,7 C23.58,7 26,9.42 26,12.5 C26,16.28 22.6,19.36 17.45,24.04 L16,25.35 L16,25.35 Z" id="Shape"></path>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 797 B

View File

@ -1,15 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<!-- Generator: Sketch 3.5.1 (25234) - http://www.bohemiancoding.com/sketch -->
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 3.6.1 (26313) - http://www.bohemiancoding.com/sketch -->
<title>ic_action_notification-mdpi</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Action-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="ic_action_notification-mdpi" sketch:type="MSArtboardGroup">
<g id="social_notifications" sketch:type="MSLayerGroup" transform="translate(4.000000, 4.000000)">
<path d="M12,22 C13.1,22 14,21.1 14,20 L10,20 C10,21.1 10.9,22 12,22 L12,22 Z M18.5,16 L18.5,10.5 C18.5,7.43 16.37,4.86 13.5,4.18 L13.5,3.5 C13.5,2.67 12.83,2 12,2 C11.17,2 10.5,2.67 10.5,3.5 L10.5,4.18 C7.63,4.86 5.5,7.43 5.5,10.5 L5.5,16 L3.5,18 L3.5,19 L20.5,19 L20.5,18 L18.5,16 L18.5,16 Z" id="Shape" fill="#FFFFFF" sketch:type="MSShapeGroup"></path>
<path d="M0,0 L24,0 L24,24 L0,24 L0,0 Z" id="Shape" sketch:type="MSShapeGroup"></path>
</g>
<g id="Action-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="ic_action_notification-mdpi" fill="#FFFFFF">
<path d="M16,26 C17.1,26 18,25.1 18,24 L14,24 C14,25.1 14.9,26 16,26 L16,26 Z M22.5,20 L22.5,14.5 C22.5,11.43 20.37,8.86 17.5,8.18 L17.5,7.5 C17.5,6.67 16.83,6 16,6 C15.17,6 14.5,6.67 14.5,7.5 L14.5,8.18 C11.63,8.86 9.5,11.43 9.5,14.5 L9.5,20 L7.5,22 L7.5,23 L24.5,23 L24.5,22 L22.5,20 L22.5,20 Z" id="Shape"></path>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 893 B

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 3.6.1 (26313) - http://www.bohemiancoding.com/sketch -->
<title>ic_action_star-mdpi</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Action-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="ic_action_star-mdpi" fill="#FFFFFF">
<path d="M16,21.27 L22.18,25 L20.54,17.97 L26,13.24 L18.81,12.63 L16,6 L13.19,12.63 L6,13.24 L11.46,17.97 L9.82,25 L16,21.27 Z" id="Shape"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 707 B